Программирование на Ассемблере
Ясно, что компьютер должен постоянно следить за состоянием этих портов,
чтобы своевременно получать сигналы от мыши и вычислять новое положение
указателя. К счастью, этим занимаются custom-чипы, освобождая процессор для
более важной работы.
Итак, Вы можете получить текущее состояние мыши/джойстика из регистров
$DFF00A и $DFF00C (для портов 1 и 2 соответственно). Старшие байты этих
регистров содержат информацию о вертикальном перемещении мыши, а младшие -
о горизонтальном.
Но будьте внимательны - не пытайтесь выводить содержимое этих регистров с
помощью AssemPro, так как это приводит к зависанию компьютера. Выглядит это
довольно занимательно (экран начинает \"мелькать\"), однако выйти из этого
состояния можно только по RESETу, в результате чего вся информация в памяти
компьютера теряется. Напишем небольшую программу для чтения этих регистров: ;(5.3A) mouse test: bsr.s run ;тестовая подпрограмма
bra.s test ;\"вечный\" цикл
illegal joy = $DFF00A
run:
move joy,D6 ;данные порта 1 в D6
move joy+2,D7 ;данные порта 2 в D7
bra.s run ;rts в случае SEKA end Если теперь оттранслировать эту программу и запустить в режиме \"Breakable\",
то содержимое регистров D6 и D7 будет периодически обновлятся на экране и
Вы сможете наблюдать за состоянием портов мыши/джойстика.
Передвиньте мышь и Вы увидите, что содержимое регистра D6 изменится. При
горизонтальном движении мыши меняется только младший байт, а при
вертикальном - старший.
Нетрудно убедится, что содержимое порта мыши зависит от направления и
скорости перемещения мыши, однако оно не определяет текущие координаты
указателя (переместите указатель в левый верхний угол и продолжайте двигать
мышь влево - содержимое D6 все равно будет менятся). Модифицируем нашу
программу чтения регистров так, чтобы она выдавала разность предыдущего и
текущего значений: ;(5.3B) ;программа чтения данных мыши
test:
bsr.s run ;тестовая подпрограмма
bra.s test ;\"вечный\" цикл
illegal joy = $DFF00A
run:
move D7,D6 ;копируем старое содержимое в D6
move joy,D7 ;новое содержимое
sub D7,D6 ;разность в D6
bra.s run ;rts в случае SEKA end Запустите эту программу и понаблюдайте за содержимым D6.
|