АППАРАТНОЕ ОБЕСПЕЧЕНИЕ
Mouse + Speccy или подключение манипулятора ММ8031 к персональному
компьютеру ZX-Spectrum © Александр Локтев, г. Херсон, 1994.
От автора.
Этот материал адресован, прежде всего, горячим поклонникам компьютера ZX-Spectrum, натурам творческим и неугомонным, желающим как-то дополнить свой Speccy, расширить его возможности и область применения, проявить себя в новом качестве, не только как банального потребителя игрушек - LOAD "" <ENTER>, но и как создатель чего-то нового. Испытывающим радость, скорее от самого процесса творения, чем от конечного результата.
Хочу поблагодарить моего коллегу и товарища Степнова А.Н. за доверительные беседы по данной теме, за идеи, которые я так нескромно использовал, за помощь при написании и моральную поддержку.
Чарльзу Муру - автору языка FORTH и сэру Клайву Синклеру, давшему мне возможность познакомиться с этим языком, посвящается.
Предисловие.
Каждый, кто работает с этим замечательным компьютером довольно длительное время и знает о существовании, кроме клавиатуры и джойстика, ещё и о другом способе управления программой - с помощью мыши - часто задает вопрос: "Ну почему этого нет у меня? Почему я должен ждать, нажав клавишу или отклонив ручку джойстика в сторону, пока курсор или стрелка медленно переместится из одного конца экрана в другой. Неужели нельзя подключить "колобок" и почувствовать себя полноценным пользователем, a Spectrum - полноценной машиной?"
Конечно, всё это уже давно существует, подключено, работает, имеет несколько разновидностей, но не у нас. Впрочем, может быть, у нас тоже что-то имеется, но мне об этом ничего не известно. Я долго ждал чего-нибудь похожего, совместимого, и сразу работающего, но не дождался, плюнул и сделал по-своему.
Необходимо добавить, что все нижеследующие рассуждения относятся только к мыши ММ8031 известной в народе, как "корветовская", которая была выбрана в качестве базовой из-за своей низкой цены и широкого распространения на Херсонской "туче".
1. Theoretics или теория или кое-что о mous'ax.
1.1. Что из всего этого получится.
Сразу же хочу немного умерить радость, возможно возникшую у Вас после прочтения предыдущих строк. Поскольку, проделав все необходимые действия, связанные с подключением, Вы, в итоге, получите устройство, которое не будет работать ни с одной из известных программ, допускающих управление от мыши и, тем более, такого управления не допускающих. То есть у Вас будет, если Вы того пожелаете, ни Kempston-mouse, ни AMX-mouse, ни какая-либо другая, а просто ММ8031, подключенная к Спектруму. Так зачем же огород городить, возможно, спросите Вы? Да, действительно, изобретать то, что уже давно работает и при этом гораздо лучше, чем то, что сделаешь сам, занятие неблагодарное и не интересное. Да я бы и не стал этим заниматься, но дело в том, что подключить, по крайней мере, этот манипулятор (что-то язык не поворачивается назвать его мышью) настолько просто, что не сделать это после того, как станет, понятен принцип его работы, просто неприлично.
Кроме того, программу поддержки манипулятора, обеспечивающую опрос и передачу параметров последнего в головную программу или драйвер, как принято говорить, можно написать на чем угодно - начиная от Бейсика и кончая машинными кодами. Последнее является немаловажным фактом, поскольку возникает возможность (при использовании машинных кодов) встроить этот драйвер в любую программу даже и не имеющую опцию "мышь" и реализовать более удобное управление. Да и при написании Вами Ваших собственных программ наличие вышеуказанной опции придаст им более профессиональный вид, а новый способ управления будет во многих случаях предпочтительнее, чем традиционный.
1.2. Что же у мыши внутри и как все это работает.
Сейчас я хочу затронуть вопрос принципа работы мыши вообще и данного экземпляра в частности. Тем, кому не терпится привести в исполнение заветную мечту немедленно взять в руки паяльник и приступить к делу, скажу следующее. Ради бога, не делайте "сопли" под прикрытием фраз типа: "Неужели будет работать?", "Надо же проверить" или же еще чего-нибудь, в любом случае относясь с недоверием к автору схемы и машине. Работать будет! Поэтому смело лепите набело без черновиков и промежуточных проверок. Впрочем, это дело хозяйское. Удачи!
Для остальных же, которые стойко решили дочитать до конца, продолжаю. На сегодняшний день существует очень большой ассортимент мышей. Поскольку стандартов на них нет, то каждый, кто берется за их разработку, руководствуется лишь своими соображениями. Различия начинаются уже с самого принципа действия - преобразования физического перемещения мыши в последовательность электрических сигналов. По этому критерию можно выделить три класса мышей: механические, оптомеханические и оптические. Для последних нужен ещё и специальный планшет, по которому происходит перемещение. По способу общения с компьютером мыши можно разделить на последовательные, имеющий интерфейс RS-232 и параллельные - с интерфейсом типа - CENTRONICS. Начинка у них тоже отличается. Обычно, всю обработку информации, получаемую от датчиков и поддержку протокола обмена данными с компьютером выполняет специальная БИС, находящаяся в самой мыши. Но, зачастую, применяется более упрощенный вариант - на "рассыпухе", как в ММ8031, или ещё проще - с одними лишь датчиками и четвёркой триггеров Шмитта, как в "графическом манипуляторе" для компьютера ЕС-1841. В этих случаях обработка данных выполняется или на плате интерфейса, или программно.
Устройство, о котором будет идти речь (ММ8031), занимает промежуточное положение, являясь оптомеханической мышью с параллельным интерфейсом что-то вроде CENTRONICS^, и простейшей обработкой сигналов датчиков.
Любое перемещение мыши происходит на плоскости и, поэтому, наиболее просто для фиксирования её местоположения использовать декартову систему координат с известными со школьного курса осями X и Y. Поскольку экран телевизора или монитора - тоже плоскость и тоже требует двух координат для задания положения точки или курсора, то, установив соответствие между аналогичными осями экрана и мыши, можно однозначно определить положение последней на плоскости стола, стула, коленке или на чем угодно, и отобразить на экране.
Механически это реализовано так. Шарик, катающийся по поверхности, обычно стола, у нас - с положенным сверху, в лучшем случае куском ватмана, у них - специального резинового коврика, передает свое вращение двум взаимно перпендикулярным осям. На каждой из осей имеется по одному диску с прорезями, расположенными аккурат между оптопарой светодиод-фотодиод. Диск при вращении то заслоняет, то пропускает луч от свето- к фотодиоду, что приводит к появлению импульсов на последнем. То есть величина перемещения Вашей руки с мышью по одной из декартовых координат, к примеру по X, за определенный промежуток времени однозначно определяется количеством оборотов диска, насаженного на ось, совпадающую с декартовой координатой Y (именно Y, так как направление перемещения не совпадает с той осью, которая вращается) за то же время. Или количеством прорезей, успевших пересечь луч светодиода. Или, в конечном итоге, количеством импульсов, поступивших с фотодиода в схему, опять-таки за данный промежуток времени.
Если до этих пор Вам все понятно, то вполне резонен вопрос: - А как же быть с направлением перемещения? Ведь по этой оси руку можно двигать и в ту, и в другую сторону, а количество импульсов, при равном относительном перемещении, будет все равно одно и то же. Так вот, на каждом диске стоит не одна, а две оптопары. И расположены они таким образом, чтобы работать в противофазе. То есть, если напротив одного фотодиода расположена прорезь и через неё падает свет от напарника светодиода, то другой фотодиод в это время затемнен.
В некоторых манипуляторах, я имею ввиду ММ8031, регулировка данного соответствия выполняется обыкновенными спичками. Так что, если у Вас в дальнейшем возникнут какие-либо проблемы с таким экземпляром, то вот одна из возможных неисправностей - спички высохли, выпали и "юстировка" нарушилась. Исправить положение, думаю, Вы сможете и без моих подсказок.
Продолжаю. Импульсы с обоих фотодиодов поступают на реверсивный счетчик с предустановкой типа К555ИЕ13. Импульсы с одного из них подаются на вход "разрешение счёта", а со второго на вход "направление счёта" и, кроме того, через задерживающую цепочку, на вход "счёт", непосредственно считающий их количество. На выходе счетчика имеем 4-х битный код, который может, как увеличиваться, так и уменьшаться, в зависимости от направления вращения диска и принимает значения от 0 до 15. Из него необходимо, каким-то образом, получить две величины - направление перемещения и его абсолютное значение. Первая определяется, как ни странно, довольно просто, поскольку это предусмотрено самой схемой. Для этого на входах предустановки заранее выставлено число в двоичном представлении имеющее вид: 1000, а в привычном для нас: 8. Что достигается просто замыканием на землю трех младших разрядов и подключением к +5В старшего. В момент сброса счетчика, производимого внешним сигналом, в него записывается код, имеющийся на входах предустановки, то есть 8. Теперь, если Вы будете сравнивать последующие показания счётчика с этим числом, то легко определите знак, а следовательно, и направление перемещения по данной координате.
Что касается определения второй величины, то, как Вы уже поняли, таким малым диапазоном чисел - всего 16, а при учёте вышесказанного и того меньше - 7, невозможно передать абсолютную координату мыши. И решение этой задачи разработчики устройства заботливо переложили на плечи тех, у кого возникнет желание опробовать его в работе. Ну а это не очень сложно. Как при измерении, скажем, длины комнаты можно пользоваться и десятиметровой рулеткой и линейкой в пол метра, так и в данном случае величину перемещения мыши можно представить суммой величин небольших перемещений. А в переложении на "железо", количеством импульсов: от 8 до 15 в одну сторону и от 8 до 0 в другую. То есть вместо одного измерения производится несколько и величина каждого последующего прибавляется к предыдущему, разумеется, со своим знаком. Таким образом, мышь как бы непрерывно отслеживается по любой из координат.
Дальше. Четырехбитный код с выхода каждого из счётчиков (Х-координаты и Y-координаты) поступает на мультиплексор типа К555КП15, а с него как четыре шины данных (D3, D2, Dl, D0) на разъём. Управлять мультиплексором для считывания четверки данных соответствующих координате X или Y можно с помощью внешнего сигнала.
Итак, для того, чтобы узнать величину и направление перемещения манипулятора отдельно по каждой оси необходимо:
•S подать сигнал сброса на счетчики;
•S через какое-то время считать значение с шины данных для одной координатной оси;
•S переключить мультиплексор и сразу же считать значение с шины данных для другой координатной оси.
Здесь имеют место некоторые тонкие моменты. Дело в том, что, если время между сбросом и считыванием будет слишком мало, то Вы рискуете не считать вообще ничего. Так как диск у манипулятора, возможно, не успеет повернуться ни на одно деление даже при самом быстром перемещении Вашей руки. И, наоборот, если это время будет слишком большим, то счётчик, работая, к примеру, на увеличение и начиная с 8, успеет перейти через 15 и начнет с 0. А Вы, считав его значение (пусть будет 3), определите, что манипулятор переместился вверх на 8-3=5 единиц, хотя, на самом деле, вниз и на 16-8+3=11.
Для тех, кто не знаком с работой счётчика, поясню, что значения на его выходе изменяются циклически. То есть, если счётчик работает на увеличение, то с приходом каждого последующего импульса, значение кода на его выходе увеличивается на единицу и при достижении значения 1111 (в десятичном представлении - 15) следующий импульс обнуляет счётчик и процесс повторяется. Аналогично и при работе на уменьшение - код на выходе уменьшается на единицу и при достижении 0000, следующий импульс устанавливает на выходе 1111, затем 1110, 1101 и так далее.
Исходя из вышесказанного, для связи (электрической) устройства с компьютером
необходимы следующие сигналы:
•f данные с шины мультиплексора (от манипулятора к компьютеру); •S сигнал инициализации или сброса (от компьютера к манипулятору); •S сигнал переключения мультиплексора (от компьютера к манипулятору). С шиной данных вопросов не возникает - это четыре провода D3, D2, D1 и D0. А вот сигналы инициализации счётчиков и переключения мультиплексора разработчики для уменьшения количества отходящих проводов решили объединить в один и обозвали "Синхро". Данное решение кое к чему нас обязывает, но об этом позже. Кроме того, я не упомянул о кнопках, имеющихся на каждой мыши, количество которых колеблется в широких пределах, но обычно равно трём (имею ввиду ихние mous'bi). Наш ММ80310 (как звучит!) тоже снабжен парой "микриков", работающих на замыкание. Два конца у них общие и соединены с землей, а два других выведены на внешний разъём и с ними можно делать все, что душе угодно. Можно завязать бантиком, отрезать, или вообще, не трогать - пусть болтаются. Но, обычно, по ним передают сигналы в компьютер. И, при этом, левую кнопку используют, как аналог клавиши "ENTER", то есть ввод или подтверждение, а правую, как "ESC", то есть выход или отмена. А по-простому: "ДА" и "НЕТ".
Итак, полный набор сигналов или проводов:
- D3
- D2 (четырехбитный код D0-D3)
- D1
- D0
- синхро-сброс и переключение мультиплексора;
- КН1 кнопка "ДА";
- КН2 кнопка "НЕТ";
- +5В питание схемы манипулятора;
- 0В земля.
2. Hardware или аппаратное обеспечение, или "железо ". Ну что, если теория Вам ясна, то практика, как и было, обещано, будет ещё проще. При разработке схемы подключения я не стал изобретать велосипед, а воспользовался имеющейся на плате компьютера микросхемой параллельного интерфейса КР5 8 0ВВ55А на порт А которого как-то давным-давно повесил джойстик. Поэтому схема получилась такая, как на рис. 1. В некоторых компьютерах эта микросхема уже имеется, кроме того, многие устанавливают ее сами для подключения периферии. Она хороша своей универсальностью и сговорчивостью. И джойстик, и программатор, и световое перо, и даже принтер находят с ней общий язык. Поэтому у кого этого простого интерфейса нет - рекомендую.
Рис. 1.
Немного о схеме. PIO (КР580ВВ55А) включается в работу или, как говорят, выбирается сигналом низкого уровня, поступающего на вход CS, что возможно, согласно схеме, при наличии 0 на шинах IORQ и A7 микропроцессора. Сигналы с шин A5 и A6, поступают на входы A0 и A1 PIO, управляют выбором активного в данный момент порта - А, В или С. Сигналы чтения PIO -RD, записи в PIO - WR, а также шина данных D0...D7 подключены напрямую к Z80. К порту A, как говорилось выше, можете подключить Kempston-джойстик. Этот порт работает только на ввод чтение информации с внешнего устройства). В порт B заведена четырехбитная шина данных от ММ8031 и он, порт B, также работает только на чтение. Порт C разделен как бы на два - по четыре шины данных в каждом. Младшая четверка - D0, D1, D2, D3 настраивается на ввод информации, а старшая - D4, D5, D6, D7 на вывод. И в общем случае порт C читает информацию при опросе состояния кнопок КН1, КН2 и работает на запись (выдает информацию на внешнее устройство) при активизации сигнала "Синхро". Поскольку провода, идущие к джойстику и кнопкам имеют значительную длину и, на самом деле, болтаются в воздухе (имеют неопределенный потенциал), то в них может появиться или навестись напряжение произвольной величины. Это приведет к ошибочному результату при опросе PIO по соответствующему порту. Для исключения этого явления и служат сопротивления R1...R5, R7, R8. Величина их, как и остальных, не критична и может находиться в диапазоне от 1 до 20 кОм. Обычно принимают номинал 10 кОм. Ну вот, пожалуй, и всё. Да, забыл сказать, что порт A, в данной реализации имеет адрес 31, порт B - 63, и порт C - 95. А в качестве элементов D1 и D2 можно использовать микросхемы К155ЛЛ1 и
К155ЛН1 соответственно.
3. Проверка и ещё раз проверка.
Если Вы уже успели подключиться и горите желанием немедленных действий, то не спешите - неплохо было бы проверить качество Вашей работы и работоспособность устройства в целом. Следующие программы дадут Вам такую возможность и, кстати, могут пригодиться в дальнейшем при ремонте, доработках и в других экстренных случаях. 10 OUT 127,147: OUT 95,16 20 PRINT AT 10,10,'IN 63;" ": GO TO 20
Эта программка производит проверку тракта координат. Первый оператор OUT производит настройку PIO, второй - переключает мультиплексор (в данном случае на Y-координату), а строка 20 опрашивает счетчик манипулятора и выводит его значение на экран. Для проверки X-координаты достаточно заменить оператор OUT 95,16 на OUT 95,0. При правильном функционировании интерфейса, Вы в обоих случаях должны наблюдать что-то вроде счётчика от 0 до 15, показания которого зависят от перемещения ММ8031.
Уверенность в работоспособности кнопок дадут Вам следующие строчки: 10 OUT 127,147
20 IF IN 95<3 THEN BEEP 0.1,0 30 GO TO 2 0
Если все три теста прошли успешно, то комплексную проверку системы поможет провести вот такая программка:
10 OUT 127,147: PRINT AT 10,8;"X=";AT 10,6;"Y="
20 PRINT AT 12,8;IN 63," ": OUT 95,16: PRINT AT 12,6;IN 63; " ": OUT 95,0 30 LET S=IN 95: IF S<3 THEN BEEP 0.1,S*10 40 GO TO 20
Правильное подключение и верно набранный листинг даст Вам возможность наблюдать зависимость величин относительных перемещений X и Y от скорости и направления манипулятора, а остановка последнего обнулит их. Кроме того, при нажатии кнопок клавиш, строка 30 обязательно передаст Вам своё восхищение слаженностью работы устройства звуковыми сигналами разной высоты. В противном случае повторяйте тесты и проверяйте разводку, питание, дешифрацию PIO и, может быть, даже саму схему ММ8031. Кстати, не знаю какой будет у него разъём - я давал распайку в расчете на часто встречающийся ГРП 15.
Поскольку интерфейс получился очень простым, то вся тяжесть взаимоотношений между Speccy и ММ8031, их диалога и разрешения конфликтных ситуаций ложится на бедную программу поддержки или драйвер. Итак.
4. Software или программное обеспечение, или драйверы.
Как уже говорилось выше, драйвер - это небольшая программа, являющаяся посредником между основной программой и устройством, которое она обслуживает. Все многообразие драйверов устройств ввода или управления курсором (не только мыши, но и джойстика, и, клавиатуры) можно разделить на две группы:
•S драйверы реализующие попиксельное перемещение курсора; •S драйверы реализующие перемещение курсора по знакоместам.
Первые применяются в программах, работающих с графикой, - графических редакторах, CAD и тому подобных системах, а вторые - в текстовых редакторах, языках программирования, базах данных и любых других, работающих с текстом.
Кроме того, драйвер, как уже говорилось, может быть написан на языке любого уровня -начиная с Ассемблера и кончая Бейсиком и даже при их совместном использовании в зависимости от каждого конкретного приложения.
Приведу несколько конкретных примеров реализации вышесказанного с подробными комментариями.
4.1. Познакоместный драйвер на Бейсике.
Допустим, у Вас возникло желание получить перемещение курсора по знакоместам. В таком случае Вам будут нужны значения X и Y координат плюс состояние кнопок манипулятора (кстати, для перемещения по пикселям нужно то же самое). На Бейсике реализация Вашего
желания может выглядеть так.
10 OUT 127,147: REM Настройка портов А и В на ввод, а порта С на ввод-вывод; 20 LET C=PEEK 2252 8: LET X=6: LET Y=10: LET XX=X: LET YY=Y: REM настройка переменных; XX и YY переменные текущих, а X и Y переменные новых координат; С -значение атрибута первого знакоместа; 30 LET X1=IN 63-8: OUT 95,16: LET Y1=IN 63-8: REM определение относительного перемещения манипулятора по координате X, переключение мультиплексора, то же самое по координате Y; 40 LET X=X+X1: IF S<0 THEN LET X=0
50 IF X>31 THEN LET X=31: REM Проверка выхода абсолютной координаты X за
границы экрана и установка крайних значений; 60 LET Y=Y-Y1: IF Y<0 THEN LET Y=0
70 IF Y>21 THEN LET Y=21: REM Аналогично для координаты Y;
80 IF Y=YY AND X=XX THEN OUT 95,0: GO TO 30: REM Если ММ8031 не перемещался,
то сброс счетчиков и все сначала; 90 LET ADR=22528+YY*32+XX:POKE ADR,C: REM В противном случае помещение в ячейку области атрибутов, соответствующую текущему знакоместу исходного значения;
100 LET ADR=22528+Y*32+X: POKE ADR,47: REM и помещение в ячейку области атрибутов, соответствующую тому знакоместу, к которому переместился манипулятор, нового значения; 110 LET ХХ=Х: OUT 95,0: LET YY=Y: REM Сброс счетчиков и присваивание
переменным текущих координат новых значений; 120 GO TO 30: REM Все сначала.
Такой вариант драйвера является скорее демонстрационной, чем рабочей программой, на которой, благодаря своей простоте и открытости можно попрактиковаться и уяснить некоторые ключевые вопросы взаимодействия hardware и software. Я назвал этот драйвер познакоместным, но это не совсем так, поскольку он реализует перемещение не по знакоместам, а по области их атрибутов. И у пользователя создается лишь иллюзия того, что курсор - тёмный квадрат -переходит от одного знакоместа к другому. Но, в общем, очень похоже. Весь фокус заключён в стоках с номерами 90 и 100. В них как раз и рассчитываются адреса области атрибутов, соответствующие текущему знакоместу и новому, на которое якобы переполз курсор. Строка 80 введена для того, чтобы курсор не "блымал" в случае остановки манипулятора. И ещё, в целях упрощения не производится опрос клавиш.
А теперь о некоторых временных характеристиках. Если помните, я говорил о промежутке времени между сбросом и считыванием, а также на что его величина влияет. Назову этот промежуток времени - временем ожидания. И сейчас Вы сможете лично лицезреть и на примере уяснить зависимость качества выполнения программы от величины этого промежутка (при наличии, конечно, подключенного устройства и набранного драйвера). Напомню, что считывание координат осуществляется командой IN 63, а сброс счётчиков командой OUT 95,0. Время ожидания зависит от того, в каком месте программы будет находиться оператор OUT. То есть оно равно времени, которое понадобиться интерпретатору Бейсика на выполнение всех команд, находящихся между операторами OUT 95,0 и IN 63. В данном случае это команды LET YY=Y и GO TO 30. Конечно, при необходимости время ожидания можно регулировать просто оператором PAUSE N, подбирая N, но уж слишком расточительно заставлять простаивать и без того медленный интерпретатор. Почему это плохо, будет ясно из дальнейшего.
Если Вы поместите, оператор OUT в строку 30 перед первым оператором IN, уменьшив, тем самым время ожидания до минимума, то курсор у Вас будет ползать как черепаха. А если куда-нибудь в строку, эдак 90, то. сами увидите, что будет. В первом случае манипулятор еле поспевал за драйвером - программа фиксировала только самые быстрые перемещения. Во втором, наоборот - для нормального отображения курсора необходимы медленные передвижения Вашей руки с ММ8031. Так что, устанавливая, оператор OUT в разные точки программы Вы можете подобрать для него наиболее подходящее место. Но это ещё не все. Кроме времени ожидания -между сбросом и считыванием существует и другое - между считыванием и сбросом. Это плохое время. Назову его мёртвым. Оно служит лишь для работы самой программы, и в нём нет места для диалога с устройством, движение которого в этот период не прекращается и должно быть отработано. Посмотрите на рис. 2. Это график зависимости перемещения манипулятора с
постоянной скоростью и в одном направлении от времени.
За время ожидания To=t2-t1 Ваша рука с устройством перемещается на расстояние So=S2-S1. Драйвер считывает это значение, обрабатывает, добавляет к предыдущему и так далее, совершенно забыв о продолжающем своё движение манипуляторе. Все это происходит за время TM=t3-t2. В момент t2 драйвер, наконец, подготовился к следующему опросу, но манипулятором уже пройдено расстояние Sm=S3-S2, которое так никем и не было зафиксировано. И чем больше мёртвое время TM, тем больше это неучтённое расстояние Sm. Что же в этом плохого? - возможно, спросите Вы. А то и плохо, что для перемещения курсора на десяток другой знакомест Вам надо отмахнуть рукой с полметра - падает чувствительность всей системы, и результат работы этого симбиоза выглядит ужасно примитивным и неинтересным.
Попробуем определить для этой системы понятие К.П.Д., зачем он нужен и как с ним бороться. Если мне не изменяет память, то К.П. Д. есть отношение полезной работы ко всей совершенной. В нашем случае полезной работой является работа, совершаемая Вашей рукой при перемещении манипулятора на расстояние So, принимаемое в расчет драйвером, а всей совершенной - работа при перемещении на расстояние So+Sm. To есть:
где Ao - работа на участке So; A„ - работа на участке Sm.
Поскольку и скорость и масса неизменны, то, я думаю, ни у кого не вызовет сомнений следующее выражение:
Ни для кого не секрет, что чем выше К.П.Д. системы, тем она выгоднее, экономичнее, эргономичнее и, вообще, заслуживает всяческих похвал. Аналогично и здесь. Ну, насчёт каких-то особых выгод и похвал я не знаю, а вот эргономические свойства, на мой взгляд, играют большую
роль. И К.П.Д. увеличивать все-таки придется.
Для этого, как видно из (4.2), нужно либо увеличивать To, либо уменьшать T„. Однако, как Вы знаете, время To нельзя чрезмерно увеличивать, как, впрочем, и уменьшать. Оно лежит в очень узких пределах. Остается время T„.
Что характерно, время одного цикла T^To+T„ для данной конкретной реализации драйвера постоянно и, поэтому, можно написать, что To+T^const. Из этого следует, что, если мы изменяем время Тм только лишь перемещением оператора OUT 95,0 внутри самой программы, то одновременно изменяем и To, только в противоположную сторону. Стало быть, такой способ увеличения К.П.Д. довольно проблематичен и малоэффективен. Могу предложить ещё два - это уменьшение объема программы и увеличение скорости её выполнения.
Отсюда выводы:
•S устанавливать время ожидания очень небольшим; •S всеми силами стремиться к уменьшению мертвого времени.
Второй вывод особенно важен для медленных драйверов - на языках высокого уровня.
Теперь что-нибудь реальное. 10 LET C=PEEK 22528: LET X=16: LET Y=16: LET ADR=22528+Y*32+X: LET MOUSE=10 20 OUT 127,147
30 LET X1 = IN 63-8: OUT 95,16: LET Y1=IN 63-8
40 LET X=X+X1: IF X<0 THEN LET X=0
50 IF X>31 THEN LET X=31
60 LET Y=Y+Y1: IF Y<0 THEN LET Y=0
70 IF Y>21 THEN LET Y=21
80 LET S = IN 95-16: IF S<3 THEN RETURN
90 IF X1=0 AND Y1=0 THEN OUT 95,0: GO TO 30
100 POKE ADR,C: LET ADR=22528+Y*32+X: POKE ADR,47
110 OUT 95,0: GO TO 30
Как использовать этот драйвер? Очень просто. В Вашей головной программе -адаптируемой, либо лично выстраданной - в том её месте, где по Вашему замыслу от потенциального пользователя (п. п.) требуются какие-то действия - что-либо выбрать или на что-то указать - необходимо установить оператор GO SUB MOUSE. Это даёт п.п. возможность неограниченно долго гонять квадратик по экрану. И, когда эта забава ему наскучит, он, наконец, вспомнит, что от него требуется, установит курсор по своему желанию и разумению и нажмет одну из альтернативных кнопок - вот тогда, следуя строке 80, и будет осуществлен возврат в головную программу. При этом Вам в руки передаются три переменные величины: Х-координата (от 0 до 31), Y-координата (от 0 до 21) и код нажатой клавиши S (1 или 2). Дальнейшее использование этого бесценного дара зависит от Ваших желаний и фантазии.
Конечно, драйвер на Бейсике это хорошо. Это простота, легкость настройки, возможность включения в любой бейсиковский диалект будь то Mega-, Beta- или другой. Но если Вам понадобится как-то изменить его - задействовать дополнительные расчеты, проверки, условия или что-то, что приведёт к увеличению размера самого драйвера, то Вы неизбежно поплатитесь за это тем, ради чего, собственно, всё и затевалось - удобством управления. Вы забыли о Тм, а оно обязательно возрастет со всеми вытекающими последствиями.
Единственный выход из этого положения - придумать, как увеличить скорость выполнения самой программы. Первое, что приходит в голову - это компилятор. Он даст возможность в несколько раз, а то и десятков раз увеличить скорость, что нам и нужно. Подойдет любой, например Mcoder2. (Всех страждущих узнать, что это такое, зачем и как работает, отсылаю к [1].) Правда, в результате этой операции Вы потеряете солидный кусок памяти Speccy - он понадобиться самому компилятору (5375 байт). Зато, какой эффект. Программу для компиляции нужно немного изменить. В частности, 30 и 80 строки будут выглядеть так: 30 LET X1=IN 63-8: OUT 95,16: LET Y1=IN 63-8: OUT 95,0
80 LET S=IN 95: IF S<3 THEN POKE ADR1,X: POKE ADR2,Y: POKE ADR3,S: RETURN где ADR1, ADR2 и ADR3 - выбранные Вами адреса для передачи параметров от откомпилированного драйвера в основную программу.
Из строки 120 оператор OUT 95,0 следует удалить. Если Вы смотрели на работу всей
43
системы до компиляции с большой приятностью - "Это ж надо, работает!" - то после этого процесса будете поражены ещё больше. Впрочем, не знаю как Вы, а я так просто обалдел. Вот Вам, пожалуйста, и эргономика, если кто желает. Хочу обратить Ваше внимание на величину времени Тм. Оно сократилось до предела и определяется лишь временем выполнения команд OUT 95,16 и LET Y1=IN 63-8. А To почти полностью совпало с временем выполнения самой программы. Это произошло за счёт резкого сокращения T (времени выполнения одного цикла программы). И, чтобы время To не уменьшилось во столько же раз, пришлось оператор OUT 95,0 передвинуть на максимально возможное расстояние. Вот и выходит, что главной задачей является уменьшение времени цикла - T№ а там уже разберемся и с To и с TM.
4.2. Познакоместный драйвер на языке FORTH с включением машинных ходов.
Возможно, в названии этой части я сделал упрощение и следовало бы к словам "на языке FORTH" добавить ещё и слова: "для языка FORTH". Поскольку, как драйвер на Бейсике работает только с Бейсиком, так и драйвер на Форте работает только с Фортом. Для чего я решил привести такой экзотический пример? С его помощью происходит убиение сразу двух зайцев. Первый заяц -это машинные коды или Ассемблер, он для начинающих - большой и страшный - хуже волка. Второй - язык программирования Форт - им (начинающим), вероятно, вообще не знаком и в данном случае происходит, скорее всего, его презентация, а уж потом расправа. Профессионалы программирования на Ассемблере, Паскале и Си этот раздел могут смело опустить. Если у первых машиннокодовые вставки вызовут, разве что улыбку, то остальные настолько увлечены своими средствами программирования, что любой альтернативный язык ими воспринимается, чуть ли не как оскорбление лучших чувств и вызывает, если не раздражение, то уж недоверие - точно.
Как видно из вышесказанного, автор этих строк, как раз и является приверженцем одного из альтернативных языков - Форта. Но в данном случае я не собираюсь переманивать Вас, почтенный читатель, на свою сторону, охаивать и подвергать сомнению существующие системы, методы и способы программирования и агитировать "за Форт". Желаю всего лишь высказать своё мнение о нем и, быть может, пробудить интерес. Любое творение, плохое или хорошее, заслуживает хотя бы простейшего ознакомления с ним (иначе как узнать какое оно), тем более, претендующее на такое высокое звание, как язык.
Немного о том, почему именно Форт. Он заинтересовал меня, прежде всего, своей необычностью и каким-то изяществом. Это и обратная польская нотация, когда вместо 3+5 нужно писать 5 3 + да ещё с пробелами, многими воспринимаемая как нагрузка, и наличие, одновременно, свойства компилятора и интерпретатора, и малый объём занимаемой памяти -всего 7 килобайт (!), и главное, высокая скорость вычислений. При этом в нём благоприятно сочетаются положительные свойства языков высокого и низкого уровней. От Ассемблера он приобрёл скорость и способность работы на уровне железа, что дает ему возможность служить операционной системой, а от языков высокого уровня простоту написания и отладки программ.
Сам процесс программирования на Форте сильно отличается от общепринятого. Вы не пишите программу, подгоняя её под известные операторы того или иного языка, а видоизменяете и дополняете сам язык так, чтобы он наиболее соответствовал Вашей задаче и её решению. Если представить программу зданием, которое нужно построить, Вас - строителем, а базу, оборудование и материалы - как средства и возможности самого языка, то Вы, приступая к строительству, сначала изготавливаете кирпичи, причем именно такие, какие нужны здесь и сейчас, а уже с их помощью строите все остальное. В то время, как у других строителей в своих грузовиках имеется большой ассортимент готовых строительных материалов и изделий -кирпичей, блоков, плит и другого - у Вас этого поменьше, а многого и вообще, нет, зато сколько угодно песка, глины, воды... с помощью которых и с божьей помощью Вы можете наштамповать прямо на стройплощадке таких красавцев, какие не снились ни одному строителю. Да что кирпичи, можно изготовить целые стены, порталы, перекрытия и даже (!) новые механизмы для производства материалов. Если на других языках можно сделать отдельно стул, отдельно стол, то на Форте Вы можете создать себе целую рабочую комнату по своему вкусу и со своими предметами. Это может быть и Ассемблер, и текстовый редактор, и графический пакет, и все что пожелаете, причём средствами только лишь самого языка.
Форт язык добрый и доверчивый, как младенец. Он разрешает Вам делать с ним всё, что угодно, практически не проверяя Ваших действий. Вы должны сами заботиться о нём, тщательно проверяя границы массивов, стек и, вообще, быть более внимательным, чем, скажем, программируя на Бейсике. Зато Форт ничего от Вас и не скрывает - ни своей структуры, ни принципов работы, а, наоборот, поощряет их изучение и предполагает их использование в Ваших программах. Готовая программа на Форте не есть нечто отдельное, как в других языках: вот компилятор, вот интерпретатор, вот сама программа - это сам язык, только расширенный и измененный Вашими стараниями. Это единый кодовый блок, пронизанный множеством связей. Форт как живой организм, который Вы растите и чем талантливее родители, тем лучше их отпрыск.
Конечно, есть и у него недостатки, впрочем, о них, как и о других его достоинствах, Вы можете узнать из специальных источников, которые приведены в разделе литература. Я пользуюсь кассетной версией 1982 года ZX-FORTH 1.1 фирмы Artie Computing, которую адаптировал к диску. В таком виде имеется возможность работать с любым из 255 экранов (блоков) по одному килобайту каждый, размещённых на диске. SCR # 10
0 ( MOUSE )
1 : code create here here 2 -!•
2 : c; current @ context ! smu dge ; hex
3 code IMouse e5 c, c5 c, 01 c , 7f c, 00 c, 26 c, 93 с , ed c, 61
4 c, c1 c, e1 c, c3 c, 84 c, 6 2 c, c;
5 code XMouse e5 c, c5 c, 01 c , 3f c, 00 c, ed c, 68 c, 01 c, 5d
6 c, 00 c, 26 c, 10 c, ed c, 6 1 c, 26 c, 00 c, c1 c, e3 c, с3 с,
7 84 c, 63 c, c;
8 code YMouse e5 c, c5 c, 01 c , 3f c, 00 c, ed c, 68 c, 01 c, 5d
9 c, 00 c, 26 c, 00 c, ed c, 6
1 c, c1 c, e3 c, c3 c, 84 c, 62 c,
10 c;
11 code SMouse e5 c, c5 c, 01 c , 5d c, 00 c, ed c, 68 c, 26 c , 00
12 c, c1 c, e3 c, c3 c, 84 c, 6
2 c, c;
13 decimal -->
14
15
Хвалебную оду я пропел, теперь непосредственно о программе. В отличие от Бейсиковского собрата этот драйвер работает значительно быстрее и, даже, чуть-чуть быстрее, чем Бейсик-драйвер после компиляции. Впечатление оставляет о себе самое приятное и занимает в памяти после трансляции 446 байт (для сравнения, Бейсик-программа после компиляции занимает 613 байт). Саму программу можно условно разделить на две части. Первая - это создание новых слов для работы с портами (изготовление кирпичей). Вторая - основная часть, непосредственно использующая их. Они для наглядности так и располагаются - первая на 10-м экране, а вторая на
45
SCR # 11
0 ( MOUSE )
1 16 variable X 10 variable Y 22528 c@ constant C 0 variable S
2 0 variable XX 0 variable YY
3 : ADR 32 * + 22528 + c!
4 : MOUSE begin 7 X @ Y @ ADR begin XMouse 8 - XX ! YMouse 8 -
Y Y
5 ! SMouse S ! S @ XX @ 0 = + Y
Y @ 0 = + 5 = while repeat C X @
6 Y @ ADR XX @ X +! YY @ -1 *
Y +! X @ 31 >
7 if 31 X ! then X @ 0 < if 0
X ! then Y @ 23 > if 23 Y ! then
8 Y @ 0 < if 0 Y ! then S @ 3 < until ;
9 IMouse
10 11 12
13
14
15
11-м.
В стандартной поставке языка нет слов, работающих с портами ввода-вывода, поэтому пришлось написать на Форте (но в кодах!) несколько новых, необходимых для конкретных целей.
IMouse - инициализация PIO (аналог OUT 127,147).
XMouse - считывание Х-координаты (аналог IN 63).
YMouse - тоже самое для Y.
SMouse - опрос состояния клавиш КН1 и КН2 (аналог IN 95).
Слова code и с; являются служебными. Hex и decimal переключают транслятор языка в шестнадцатеричную и десятичную системы считывания соответственно.
Вторая часть, если присмотреться внимательно, является почти полным аналогом нашего первого драйвера на Бейсике. Здесь, кроме аналогичных переменных X, Y и других, имеется переменная S, которая содержит результат опроса клавиш. Выход из цикла происходит при нажатии хотя бы одной из них. Собственно говоря, весь драйвер это одно слово Mouse. И Вы можете вставлять его в любое место своей программы. Так же как и драйвер на Бейсике, драйвер на Форте открыт для любых изменений, переделок и доработок, но в отличие от первого не топчется на месте, а отрабатывает положения курсора быстро и четко.
Если работу слова Mouse ещё могут понять хотя бы те, кто знаком с языком, то слова IMouse, XMouse и так далее, останутся за пределом понимания большинства, за исключением, быть может, какого-нибудь фаната, выучившего наизусть в результате длительного общения с Ассемблером коды процессора Z-80. Поэтому доведу до Вас смысл и содержание этих четырёх слов. Итак, слово IMouse. На Ассемблере оно выглядит так:
PUSH |
HL |
/сохранение регистров на стеке |
PUSH |
BC |
|
LD |
BC,#007F |
;в регистр ВС адрес порта 127 |
LD |
H, #93 |
;в регистр Н число 147 |
OUT |
(C) , H |
/запись 147 по порту 12 7 |
POP |
BC |
; восстановление регистров со стека |
POP |
HL |
|
JP |
#6284 |
/возврат к Форт-интерпретатору |
|
Слово IMouse. |
|
PUSH |
HL |
; сохранение регистров на стеке |
PUSH |
BC |
|
LD |
BC,#003F |
; в регистр ВС адрес порта 63 |
IN |
L, (C) |
/чтение порта 63 с занесением Y-координаты в L |
LD |
BC,#005D |
; в регистре ВС адрес порта 95 |
LD |
H, #00 |
; |
OUT |
(C) , H |
/запись в порт В нуля (сброс) с одновременным |
|
|
/переключением мультиплексора на Y-координату |
POP |
BC |
/восстановление регистра ВС |
EX |
(SP),HL |
/обмен регистра HL со стеком, в результате |
|
|
/чего Y-координата оказывается на вершине |
|
|
/стека, а регистр HL восстанавливается |
JP |
#6284 |
/ возврат к Форт-интерпретатору |
|
Слово XMouse. |
|
PUSH |
HL |
/ сохранение регистров на стеке |
PUSH |
BC |
|
LD |
BC,#003F |
/ в регистр ВС адрес порта 63 |
IN |
L, (C) |
/чтение порта 63 с занес. X-координаты в L |
LD |
BC,#005D |
/ в регистре ВС адрес порта 95 |
LD |
H, #10 |
/ |
OUT |
(C) , H |
/переключение мультиплексора на Y-координату |
LD |
H, #00 |
|
POP |
BC |
/ восстановление регистра ВС |
EX |
(SP) , HL |
/ обмен регистра HL со стеком, в результате |
/чего X-координата оказывается на вершине /стека, а регистр HL восстанавливается
JP |
#6284 |
/ возврат к Форт-интерпретатору |
|
Слово SMouse. |
|
PUSH |
HL |
/ сохранение регистров на стеке |
PUSH |
BC |
|
LD |
BC,#005D |
/ в регистре ВС адрес порта 95 |
IN |
L, (C) |
/ чтение порта 95 с занесением результата в L |
LD |
H, #00 |
|
POP |
BC |
/ восстановление регистра ВС |
EX |
(SP) , HL |
/ результат опроса клавиатуры на вершину стека |
JP |
#6284 |
/ возврат к Форт-интерпретатору |
Результат опроса порта 95 может быть таким: 3 - не нажата ни одна клавиша, 2 - нажата клавиша КН2, 1 - нажата клавиша КН1.
Некоторые комментарии. Поскольку Форт является стековым языком, и в данной реализации стек его параметров и машинный стек совпадают, то проще и удобнее любые значения из машинных кодов в Форт передавать именно через него - стек.
Оттранслированные коды любого из этих фрагментов и есть то, что записывается в определении соответствующего слова. Например, в каждом из них первыми записываются коды "е5" и "с5", что в переводе с машинного кода на Ассемблер означает PUSH HL и PUSH BC, а "с," это слово самого Форта, означающее запись предыдущего байта в следующую свободную ячейку памяти словаря. Можно привести аналогию со списками DADA для Бейсика, в которые Вы записываете машинные команды, а оператор READ в совокупности с POKE, NEXT и FOR переносит его в ячейки памяти, указанные Вами. При обращении к этой программе Вы набираете заветное RANDOMIZE USR, не забыв указать адрес. На Форте слово "code" - это и DADA, и READ, и РОКЕ, и так далее. При этом Вам не нужно следить за адресами, транслятор сам выделит в памяти место под этот фрагмент. Обращение же или вызов нужной Вам подпрограммы, а теперь слова - по его имени, опять-таки без всяких адресов. Вот так просто, красиво и лаконично.
Временная характеристика драйвера подобна характеристике драйвера на Бейсике, подготовленного к компиляции. Время To практически равно времени выполнения всей программы, а Тм - всего лишь времени выполнения следующей последовательности XMouse 8 -XX !, что аналогично Бейсиковскому LET XX=IN 63-8.
4.3. Драйвер на Бейсике для попиксельных перемещений. Быстро бегающий по экрану квадратик, чутко реагирующий на малейшее движение кисти Вашей руки, впечатляет. Но, согласитесь, как-то мало от этого проку и не видно пока конкретных результатов всей канители с подключением. Чтобы не разочаровывать Вас предлагаю разобраться и запустить следующий вариант драйвера, являющегося, одновременно, и программой рисования кривых произвольной формы. Программа очень коротенькая, но эффектная и, надеюсь, окажет на Вас благотворное влияние.
В этом варианте клавиши манипулятора имеют несколько расширенный потенциал своих действий. Левая работает как триггер и нажатие на нее приводит к переключению режима работы пера, являющегося, по совместительству, и курсором. Он или оставляет за собой цвет чернил или нет. Вернее, во втором случае он тоже оставляет след, но имеющий цвет бумаги и, поэтому, в этом режиме его можно использовать как стирательную резинку. После срабатывания правой раздается звуковой сигнал, которым программа сообщает об ожидании дальнейшего нажатия клавиш. Левая в этом случае очистит экран и вернет Вас в программу, а правая выгрузит на ленту картинку и снова запустит программу.
5 LET V=0: LET X=100: LET Y=100: OUT 127,147 10 LET X1=IN 63-8: OUT 95,16: LET Y1=IN 63-8 20 LET X=X+X1: IF X<0 THEN LET X=0 30 OUT 95,0: IF X<255 THEN LET X=255
40 LET Y=Y+Y1: IF Y<0 THEN LET Y=0 50 IF Y>175 THEN LET Y=175 60 PLOT X,Y
70 LET S=IN 95: IF S<3 THEN GO SUB 100 80 OVER V: PLOT X,Y: OVER 0 90 GO TO 10
100 IF S=2 THEN LET V=NOT V: RETURN 110 BEEP 0.5,10
120 IF IN 95=1 THEN INPUT "Name LINE A$: SAVE A$ SCREEN$: RETURN 130 IF IN 95=2 THEN CLS: RETURN 140 GO TO 120
За счёт большой величины времени цикла, обусловленной в основном операцией PLOT, вместо гладких и непрерывных кривых Вы получите, особенно при быстрых перемещениях, пунктирные. Хотя с художественной точки зрения этот эффект или, скорее всего, дефект выглядит неплохо - его при желании можно легко устранить компиляцией.
Так как целочисленный компилятор понимает не все операторы Бейсика, в том числе SAVE, и NOT, то в программу необходимо внести некоторые изменения и дополнения. Ниже приведены строки, которые корректируются и добавляются. Кроме того, из строки 40 оператор OUT 95,0 нужно удалить.
10 LET X1=IN 63-8: OUT 95,16: LET Y1=IN 63-8: OUT 95,0
70 LET S=IN 95: IF S<3 THEN GO TO 100
100 IF S=2 THEN IF V=0 THEN LET V=1: GO TO 80
105 IF S=2 THEN IF V=1 THEN LET V=0: GO TO 80
120 IF IN 95=1 THEN RETURN
130 IF IN 95=2 THEN CLS : GO TO 80
140 GO TO 120
150 STOP
160 RANDOMIZE USR adr: INPUT "Name LINE A$: SAVE A$ SCREEN$: GO TO 160
Строка 150 введена для указания границы компиляции ("MCoder2" воспринимает STOP как конец программы и всё, что идёт после него, не компилирует). Параметр adr это адрес запуска откомпилированной программы, обычно равный 40000. Строка 160 служит для запуска программы, сохранения картинки и возвращения обратно. То есть после успешной компиляции Вам достаточно набрать RUN 160 или GO TO 160 и Вы в программе.
4.4. О драйверах на ассемблере.
Если все то, о чём я говорил так "долго и нудно", у Вас работает, Вы этим довольны, и оно соответствует Вашим задачам, то это просто прекрасно. Но не обольщайтесь, со временем запросы Ваши возрастут, а задачи, позволяющие их реализовать, выйдут из круга простых. Первой и весьма тривиальной (по запросам, а не по осуществлению) может оказаться обычная адаптация некоторых любимых Ваших программ к "мышиному" управлению. Конечно, если это Бейсик -вопросов нет. А если какая-нибудь Art Studio, или TLW, или того похлеще, игровая? Обычно в такой ситуации реальную помощь может оказать только Ассемблер. Да и, работая на обычном Бейсике, или одном из его диалектов как Вы будете действовать, если экран разбит на 64 или, что ещё интересней, 42 знакоместа? Атрибуты уже здесь не помогут. Очевидно, придется что-то куда-то печатать, а этот процесс займет гораздо больше времени, чем обычный РОКЕ. Вот и приходится брать в руки разные MONS'bi, GENS'bi и вперед.
По принципу работы драйверы на Ассемблере можно разделить на два класса -работающие как обычные подпрограммы и работающие по прерываниям второго рода. Первый класс аналогичен Бейсиковским подпрограммам, только работающим быстрее. Второй класс более интересен, поскольку драйвер, к нему относящийся, независим от основной программы, будь то Бейсик или Ассемблер (если, конечно в них самих не используется этот режим прерываний). То есть, если, а первом случае Ваш курсор бегает только тогда, когда этого хочет головная программа, а в остальное время или стоит на месте или исчезает, то во втором - хочет того программа или нет, а работа драйвера не прекращается. И Вы контролируете курсор в любой момент её выполнения. И тот и другой способ имеет свои достоинства и недостатки, но, как мне
кажется, при разработке новых программ предпочтение следует отдавать второму.
Приведу алгоритм работы одного варианта драйвера, который может служить заготовкой для обоих классов (рис. 3).
В блоке PUSH производится сохранение на стеке всех регистров, используемых драйвером в своих целях. Следующий блок - это опрос клавиш. Условие в ромбике проверяет сам факт их нажатия. И, если он имел место, то следующий шаг - обработка их кода S. Это может быть просто сохранение S в памяти и выход из подпрограммы, или что-то более сложное - тут уж на Ваше усмотрение. Если ни одна из клавиш не нажата, то считывание координаты X, затем Y с последующим сбросом (именно в такой последовательности!) и сравнение их с числом 8. В случае равенства их 8 - манипулятор стоит на месте - переход к блоку POP и возврат из подпрограммы, иначе отработка перемещения курсора и здесь же все то, что Вы считаете нужным. Блок POP это восстановление со стека всех использованных регистров, a RET ... он и есть RET -возврат.
Рис. 3
Если драйвер получился довольно насыщенным и автономным, в том смысле, что выполняет все свои обязанности и, даже, более того, то есть смысл несколько изменить его алгоритм. Сделать, например, возврат в головную программу только при нажатии клавиши. Такой вариант будет служить заготовкой драйвера относящегося к первому классу (Рис. 4).
В данном разделе я не привел ни одного примера драйвера на Ассемблере. Поскольку, во-первых, это уже нечто более серьезное, чем все предыдущие забавы, во-вторых, слишком уж выходит за пределы выбранной темы о подключении, и, в-третьих, я надеюсь продолжить этот разговор и в дальнейшем: подготовить материал о работе мыши-манипулятора с конкретными программами при помощи конкретных драйверов. Если у кого-то возникнет желание двигаться в этом направлении, не дожидаясь меня или других благоприятных событий, то такое решение я буду только приветствовать.
Рис. 4. Послесловие.
Признаюсь, в мои планы не входило создавать этакую монографию о "грызунах" и чуть ли не исследование в области управления. Поначалу хотел дать всего лишь схему подключения и парочку программ. Но этот процесс так захватил, что, сам того не ведая, я увлекся и ... и, наконец, разобрался с принципом работы устройства и всем остальным. Поскольку до этого подключение и программную поддержку делал на полуинтуитивном уровне, почти "методом тыка". Теперь же все это выглядит вполне научно и заслуживает, если уж не похвалы, то хотя бы нескольких критических замечаний.
Зачем я все так подробно описывал? Ну, во-первых, раз это интересно мне, то, быть может, найдется кто-то, кому эти заметки тоже придутся по душе. Во-вторых, хотел дать максимум информации для самостоятельной работы, дабы начать заполнять пробел в вопросе "мышефикации" Speccy. И, в-третьих, пробудить интерес к Форту как языку программирования на все случаи жизни и операционной системе. Не знаю, удалось что-то мне или нет, но если Вы хотя бы дочитали до конца, то и на том спасибо.
Абсолютно не рассчитываю, что данный "мышиный интерфейс" станет стандартом. Моей задачей являлось, скорее всего, дать толчок или, как сейчас принято говорить, пригласить к диалогу по этому вопросу, или проблеме, или - как хотите. Думаю, что будут созданы интерфейсы для каждой из имеющихся на рынке мыши и написаны свои драйверы - это не сложно. Главный вопрос состоит в их взаимозаменяемости и совместимости при работе с каждой конкретной программой, или, по крайней мере, незначительной переделке программной поддержки, что предъявляет определенные требования к разработчикам системных, прикладных и игровых программ, если они хотят видеть свои детища законченными и пользующимися широким спросом программными продуктами.
В заключение хочу пожелать Вам удачи во всем. Буду рад любой обратной связи.
Литература.
1. "Диалекты Бейсика для ZX-Spectrum". Под ред. Родионова Н., Ларченко А. МП "Питер" (Piter Ltd), 1992 г. - 320 с.
2. Ларченко А., Родионов Н. "ZX-Spectrum для пользователей и программистов". МП "Питер" (Piter Ltd), 1991 г. - 160 с.
3. Семенов А. "Программирование на языке Форт". - М.: Радио и связь, 1991 г. - 204 с.
4. Баранов С.Н., Ноздрунов Н.Р. "Язык Форт и его реализации". - Л.: Машиностроение. 1988 г. - 137 с.
5. Броуди Л. "Начальный курс программирования на языке Форт". Пер. с англ. - М.: Финансы и статистика, 1990 г. - 352 с.
6. Келли М., Спайс Н. "Язык программирования Форт". Перевод с англ. - М.: Радио и связь, 1993г. - 320 с.