Прежде всего, нужно вспомнить, что в начале 90-х на какой-то крупной ежегодной компьютерной выставке, фирмой Атари был представлен неизменённый компьютер Atari 130XE с мышью STM1 от Atari ST. То-есть, планы производства - БЫЛИ!
Кроме этого, в этом посте я буду называть "Joystick Port" Атари - "Controller Jack" (CJ), так как он используется не только для джойстика и говорить здесь мы будем о мыши.
Со стороны Атари:
CJ имеет 9 штырьков.
Пины 1,2,3,4 - цифровые(один ниббл), в порядке N S W E (компас)
5,9 - аналоговые(декодируются встроенными в Атари АЦП),
Пин 6 - кнопка триггера,
пин 7 - +5v, пин 8 - земля (питание контроллера от Атари).
Для описания взаимодействия Атари-8 и STM1 мы должны различать старые и новые модели.
В старых моделях (до XL серии) 4 CJ, в новых только 2.
Каждая пара CJ передаёт данные в PIA (Peripheral Interface Adapter).
В памяти Атари, PIA представлен в HW регистрах PORTA и PORTB.
Таким образом, CJ 1,2 маппируются соответственно в младший и старший ниббл PORTA, а CJ 3,4 маппируются соответственно в младший и старший ниббл PORTB.
В новых моделях PORTB не используется для передачи данных с контроллеров.
В остальном они идентичны.
Далее речь ведётся о новых моделях...
Пусть мы хотим передавать данные с мыши в CJ2, то есть в старший ниббл регистра PORTA... (Логично, если ещё используется Джойстик...)
В соответствии со стандартом Атари, каждый ниббл должен передавать в:
- младшем дибайте(полуниббле) - вертикальное смещение.
Пин 1-N, 2-S (Север-Юг), т.е. Ось Y
- старшем дибайте - горизонтальное смещение.
Пин 3-W, 4-E (Запад-Восток), т.е. Ось Х
...
Со стороны STM1: Обратите внимание на различие координатных пинов в Джойстике и мыши!!!
Мышь STM1 представляет собой два покоординатных инкрементальных кольцевых цифровых энкодера аналоговой позиции контроллера. Валкодеры мыши Атари СТМ1 производят преобразование аналогого движения мыши в цифровой сигнал посредством энкодера согласно Коду Грея.
Обычный двоичный код является взвешенным или позиционным кодом, в котором позиция отражает вес бита. Если взять седьмой бит, его вес будет 2^7, то-есть 128, в десятичном виде. Таким образом, если мы передаём байт и пропадает 7-й бит, то ошибка составит 128(dec). Это неприемлемо для позиционного датчика.
Код Грея
- является двоичным юнитдистантным невзвешенным отраженным циклическим кодом.
Разберём:
Двоичный - понятно
Юнитдистантный - Раз в двоичном коде юнитом является бит, значит расстояние между любыми последовательными значениями - тоже будет 1 бит.
Невзвешенный - Непозиционный (перекликается в чем-то с юнитдистантным)
Отраженный - Получается путём отражения
Циклический - может быть закольцован причём остальные свойства не будут нарушены
Основная цель кода Грея - в минимизации ошибок в цифровом тракте до одного бита при любом изменении данных датчика.
Тривиальный код Грея это - последовательность (0 1).
Эта последовательность может быть зациклена, причем, как при прямом, так и при возвратном движении по циклу, разница между соседними значениями сигнала не превышает 1 бита.
Чтобы сохранить вышеуказанные свойства при увеличении разрядности цифрового сигнала, Грей сначала отражает код, чтобы обеспечить юнитдистантность при любом количестве разрядов, а потом в добавляемом старшем разряде записывает нули для прямого и единицы для отраженного кода, чтобы получить уникальные значения датчика.
Таким образом код преображается в следующий:
(0 1) -> (0 1 1 0) - отражение
В отраженном коде пропала уникальность значений!
Добавим старший разряд:
(0 0 1 1) - старший разряд
(0 1 1 0) - младший разряд
то есть, в порядке старший-младший, на выходе мы получаем следующие значения:
00 01 11 10
Этот код имеет все свойства кода Грея.
Именно эти значения используются валкодером мыши для кодирования данных дибайта как для оси Х, так и для оси У.
Пример четырёхбитового валкодера.
На сегодня - всё, zen