Важная информация

User Tag List

Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 18

Тема: Использование мыши в восьмибитной Атари (Ассемблер).

  1. #1
    Activist Аватар для ezswift
    Регистрация
    26.02.2011
    Адрес
    Москва
    Сообщений
    258
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    25
    Поблагодарили
    18 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Использование мыши в восьмибитной Атари (Ассемблер).

    Прежде всего, нужно вспомнить, что в начале 90-х на какой-то крупной ежегодной компьютерной выставке, фирмой Атари был представлен неизменённый компьютер Atari 130XE с мышью STM1 от Atari ST. То-есть, планы производства - БЫЛИ!

    Кроме этого, в этом посте я буду называть "Joystick Port" Атари - "Controller Jack" (CJ), так как он используется не только для джойстика и говорить здесь мы будем о мыши.

    Со стороны Атари:

    CJ имеет 9 штырьков.
    Нажмите на изображение для увеличения. 

Название:	CJ.jpg 
Просмотров:	161 
Размер:	20.3 Кб 
ID:	64130
    Пины 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... (Логично, если ещё используется Джойстик...)
    Нажмите на изображение для увеличения. 

Название:	PORTA.png 
Просмотров:	147 
Размер:	10.6 Кб 
ID:	64131
    В соответствии со стандартом Атари, каждый ниббл должен передавать в:
    - младшем дибайте(полуниббле) - вертикальное смещение.
    Пин 1-N, 2-S (Север-Юг), т.е. Ось Y
    - старшем дибайте - горизонтальное смещение.
    Пин 3-W, 4-E (Запад-Восток), т.е. Ось Х

    ...

    Со стороны STM1: Обратите внимание на различие координатных пинов в Джойстике и мыши!!!

    Нажмите на изображение для увеличения. 

Название:	Mouse Port.jpg 
Просмотров:	156 
Размер:	19.2 Кб 
ID:	64132
    Мышь 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
    Этот код имеет все свойства кода Грея.

    Именно эти значения используются валкодером мыши для кодирования данных дибайта как для оси Х, так и для оси У.

    Пример четырёхбитового валкодера.
    Нажмите на изображение для увеличения. 

Название:	Gray4.gif 
Просмотров:	200 
Размер:	19.4 Кб 
ID:	64133

    На сегодня - всё, zen
    Последний раз редактировалось ezswift; 24.02.2018 в 12:06.
    MAC и PC - это всего лишь периферия для Атари...
    130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Activist Аватар для atariki
    Регистрация
    22.01.2011
    Адрес
    г. Кирово - Чепецк
    Сообщений
    308
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А компьютер не подвисает из за просчёта данных от мыши интересно ?
    ATARI 65XE|130XE|XEGS|4-XC12|(2-TURBO2000)|SIO2SD

  4. #3
    Activist Аватар для ezswift
    Регистрация
    26.02.2011
    Адрес
    Москва
    Сообщений
    258
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    25
    Поблагодарили
    18 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Здравствуйте, atariki!

    Как всегда, у Вас весьма существенные вопросы.

    Чтение мыши заключается в некой предподготовке...

    мы должны прочесть только мышь, а не месиво битов.
    Мы должны прочесть и учесть только данные по одной координате, затем по другой.
    Затем, только, как-то это всё обработать.

    Я уже тыщу раз настаивал на том, что машкоды НЕ УМЕЮТ НИЧЕГО, кроме как гонять байты туда и сюда!

    Посмотрите на картинку из предыдущего поста Atari-8 PORTA register.

    Если мы хотим считать только горизонтальные данные из CJ2, мы должны:
    1. Считать PORTA
    2. Очистить CJ1
    3. Очистить Ver для CJ2
    Так мы получим Hor данные.

    Взяв старые Hor данные, мы моделируем (из старых и новых [оба Грейкоды]) уникальное (Sic! - так как Грей) смещение по таблице движений.

    Здесь совсем нет расчётов. Только перемещения битов. Всё в Аккумуляторе. Для хранения используется стек и ячейки на нулевой странице.

    Всё - не только О-о-очень быстро, но и вполне выполнимо. Это - ответ на Ваш вопрос.

    Теперь о существенности вопроса.

    Проблемы ЕСТЬ!
    1. Прежде всего из-за отсутствия прерываний по мыши. То есть код должен постоянно исполняться, а не так как в PC только по прерыванию мыши. Это - расточительно!
    (У меня есть идейка, спросить ГУРов о возможности использования прерываний по клавиатуре, так как в 130XE есть 4 неиспользуемых клавиши: F1,F2,F3,F4, которые используются в 1200XL ...)
    2. Затем проблема ГДЕ?!!
    Где? В каких прерываниях исполняется код?
    Если в Таймере, то это может мешать звуку в играх. (Там всё еле-еле. Едва хватает, просто для качественного звука.)
    Если в DLI, то это может зверски мешать DOSу, который имеет CRITIC действия.

    Я это к тому, что ВСЁ зависит от Вашей программы.

    Тем не менее, алгоритм, который выдаёт только покоординатные смещения вполне и просто реализуем и работоспособен как в DLI, так и в TIMER прерываниях.

    Я писал в TIMER, так как мне нужен был одновременно работающий DOS.

    Ладно.

    Подскажите, с чего начать.

    Демка содержит четыре раздела.
    1. Чтение Мыши
    2. Таймер
    3. PM курсор
    4. Реакция на кнопку.

    Абсолютно не знаю с чего начать.!

    zen
    MAC и PC - это всего лишь периферия для Атари...
    130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|

  5. #4
    Activist Аватар для ezswift
    Регистрация
    26.02.2011
    Адрес
    Москва
    Сообщений
    258
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    25
    Поблагодарили
    18 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Приступим, помолясь.

    Давате пройдём вдоль алгоритма...

    ВНИМАНИЕ!
    В действительности здесь ПО ОШИБКЕ описаны вычисления по оси Y, а алгоритм касается оси X. (Различие пинов для Джойстика и Мыши!)
    Сам алгоритм верный. См. последнее примечание!


    rdport

    1. В Акумулятор, данные порта грузятся командой
    LDA (LoaD Accumulator)

    lda PORTA ; %EWSNewsn

    2. Теперь надо избавится от данных CJ1. Делается это командой
    LSR (Logical Shift Right) она сдвигает байт на один бит вправо, заполняя слева недостающий бит слева нулём ...

    lsr a
    lsr a
    lsr a
    lsr a ; %0000EWSN

    3. Очищенный от CJ1 байт сохраняем на стек командой
    PHA (PusH Accumulator)
    Теперь байт и в Аккумуляторе и на стеке

    pha

    4. Теперь избавляемся от данных по оси X содержащихся в старшем дибайте ниббла командой
    AND (AND with Accumulator)
    Эта команда сохраняет всё, что под единицами маски и обнуляет остальное

    and #%00000011 ; %000000SN

    5. Пора формировать СМЕЩЕНИЕ по таблице движений movtab.

    Данная таблица содержит значения (-1),0,(+1), при этом в Атарьской знаковой системе (-1)=255.
    (Просто начиная со 128, автоматически устанавливается флаг процессора N - Negative), итак:
    (-1) - движения нет, просто сохраняем Y в ypos
    0 - движение вниз, значит координату экрана по y надо уменьшить
    1 - движение вверх, значит координату экрана по y надо увеличить

    Важная заметка!
    переменная oldy имеет следующую структуру, полученную при инициализации/формировании: %0000sn00. Увидите далее...
    ORA (OR with Accumulator) устанавливает соответствующие маске биты в 1

    ora oldy ; %0000snSN, где sn - старое значение из oldy

    То есть из двух Грейкодов, старого и нового, мы сформировали в Аккумуляторе однозначный ниббл, (значения от 0 до 15) являющийся смещением в таблице movtab.

    6. Смещение будем задавать в регистре X командой
    TAX (Transfer Accumulator to X)

    tax ; %0000snSN в X

    7. Смещение задано. Избавимся от старшего дибайта в Аккумуляторе.

    and #%00000011 ; %000000SN

    8. Формируем новое значение oldy (См. Заметку...) командой
    ASL (Arythmetic Shift Left) - Сдвигает влево биты в аккумуляторе, заполняя недостающие справа нулями.
    (Арифметический, потому, что учитывает переполнение, но нам это не нужно.)

    asl a
    asl a ; %0000sn00

    9. Инициализируем переменную этим значением командой
    STA (STore Accumulator to memory)

    sta oldy

    10. Всё готово для обработки данных экрана и клиппирования области экрана!
    Заметка:
    Клиппирование - это проверка на невыход курсора за область экрана.

    ; Загружаем координату по Y в Y-рег
    ldy ypos
    ; Индекс в таблице задан в X-рег ранее, читаем данные в таблице
    lda movtab,x
    ; Учитывая инфо из пункта 5. исследуем полученное и осуществляем соответствующую обработку
    bmi story ; (-1) - просто сохраняем
    bne decry ; (+1) - уменьшаем координату
    incry
    iny ; (0) - иначе, увеличиваем координату
    cpy maxy ; Сравниваем с MAX значением...
    bcc story ; ... если в зоне экрана, просто сохраняем
    decry
    dey ; ... при выходе за экран, уменьшаем координату (возвращаем в экран)
    cpy miny ; Те же действия с MIN значением
    bcc incry ; ... при выходе за экран, увеличиваем координату
    story
    sty ypos ; Просто сохраняем координату

    ...


    Вот такой вот алгоритм для обработки оси Y

    Чтобы обработать ось X, нужно сначала прочитать со стека сохранённое значение, затем избавиться от данных по оси Y и далее, действовать по этому же алгоритму

    Примечание:
    Дьявол прячется в мелочах.
    Я честно запрограммировал с нуля хендлер, но он внезапно стал алгоритм по Y применять к X и наоборот.
    Когда я догадался посмотреть на выложенные в предыдущих постах картинки портов я заметил, что в STM1 - другое расположение дибайтов по направлениям, чем в джойстике!!! Посмотрите сами!


    Вот правильный код:

    Код:
    ; This handler must be in interrupt (DLI or TIMER)
    ; It may read mouse near 800 times/sec
    rdport
    ;
    ; handler for X
            lda PORTA
            lsr a
            lsr a
            lsr a
            lsr a
            pha 
            and #3
            ora oldx
            tax 
            and #3
            asl a
            asl a
            sta oldx
            ldy xpos
            lda movtab,x
            bmi storx
            bne decrx
    incrx
            iny 
            cpy maxx
            bcc storx
    decrx
            dey 
            cpy minx
            bcc incrx
    storx
            sty xpos ; Datum for PMG
    ;
    ; The same for Y
            pla 
            lsr a
            lsr a
            and #3
            ora oldy
            tax 
            and #3
            asl a
            asl a
            sta oldy
            ldy ypos
            lda movtab,x
            bmi story
            bne decry
    incry
            iny 
            jmp checky
    decry
            dey 
    checky
            cpy miny
            bcc incry
            cpy maxy
            bcs decry
    story
            sty ypos ; Datum for PMG
    
    ...
    
    ; Program Variables
    oldx    .by 126
    oldy    .by 128
    xpos    .by 126
    ypos    .by 128
    maxx    .by 208
    maxy    .by 224
    minx    .by 48
    miny    .by 32
    ;
    ; The Indextable (-1)=no action!
    movtab
           .by 255,1,0,255,0,255,255,1,1,255,255,0,255,0,1,255
    
    Последний раз редактировалось ezswift; 24.02.2018 в 11:58. Причина: В примечании
    MAC и PC - это всего лишь периферия для Атари...
    130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|

  6. #5
    Member
    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    192
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    14 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    ezswift, не знаю насколько эффективно это можно перевести на ассемблер, но для сигналов энкодера есть такой алгоритм обработки:
    if(Bit0!=Old0 || Bit1!=Old1){
    if(Bit0!=Old1)
    ++Coo;
    else
    --Coo;
    Old0=Bit0; Old1=Bit1;
    }

  7. #6
    Activist Аватар для ezswift
    Регистрация
    26.02.2011
    Адрес
    Москва
    Сообщений
    258
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    25
    Поблагодарили
    18 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Здравствуйте, blackmirror!

    Я не совсем понимаю смысл вопроса.
    Буду отвечать по частям.

    Эффективна ли реализация эмуляции ЛЮБОГО языка высокого уровня на ассемблере? Да!
    Можно ли на Ассемблере реализовать более эффективно алгоритм? Да!

    Отвлечёмся...
    Насколько я знаю, для Атари эффективно НЕ реализован ни один Си-подобный язык.
    Те, два, которые претендуют на ANSI C и на К&R С (1-издание), а именно CC65 и CC8 либо неприемлемо медленны (СС65 называют улиткой из рода черепах), либо недостаточно наварочены. Всё упирается в 8-bit и 1,79 MHz.
    Лично мне милее CC8... Я на нём даже написал библиотеку работы с кучей(HEAP) и небезызвестный Гуру FJC написал мне, что даже и не слышал о таком языке и думал, что структуры реализованы только в CC65.

    Знаю также то, что современные проекты для Атари пишутся на Ассемблере (ну, на кросс-ассемблерах)...
    Я-то люлю писать на Атари всё, что для Атари... (Ну, может коды на ПиСи, а Ассемб/Компи-лирую на железе)

    И вообще, мой любимый язык для Атари - это PL65. (раньше был Interlisp65)

    Что касается алгоритма, то все проверки на несоответствие старых и новых значений в нём реализованы.
    Обновление данных для чтения - тоже. Кроме этого, самая сугубая фишка данного кода - LUT.
    То-есть использование заранее заданных таблиц, вместо вычислений. Перенёс данные за 1/2 такта и ответ в кармане.

    А то, что на Си можно написать короткий код, мы понимаем.
    А длина машкода этого кода, увы зависит от реализации ЯВУ. А здесь нет данных, кроме дезассемблирования.
    Ассемблер - это всего лишь машкоды!

    Не обессудьте, если я чего не понял. Потому как в начале признался...
    zen
    MAC и PC - это всего лишь периферия для Атари...
    130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|

  8. #7
    Activist Аватар для ezswift
    Регистрация
    26.02.2011
    Адрес
    Москва
    Сообщений
    258
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    25
    Поблагодарили
    18 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Даёшь PMG!

    А давайте-ка мы займёмся Player-Missile Graphics (PMG) ...
    Я, лично, до этого дорос, увы!.. Старый, - я.

    Итак, после включения исправной Атари, Вы имеете полностью готовую систему прорисовки PFG (Play Field Graphics)! Для неё в Атари включены логические S: и E: девайсы!!! Далее, всё сабо-самой мазуреется!

    Что же включено в систему для прорисовки PMG?
    Правильно, Ничего!

    Делаем главный вывод: - ЭТО НЕСИСТЕМНАЯ ФУНКЦИЯ графического сопроцессора!

    То есть программист PMG должен быть системщиком. А системщик знает массу бяков:
    - ограничения
    - условия
    - невозможности
    ...

    Итак, зная, что так или иначе, картинка рисуется при помощи:
    ANTIC (Alpha-Numeric Television Interface Cоntroller) ...
    -, а Вы думали, что ANTIC - это просто примочка? НЕТ!
    - Это полноценный ЧПУ (и само слово микроконтроллер именно отсюда), управляющий 2D графикой.
    Просто у него, исходя из задач, вывод в память заменён выводом в шину GTIA.

    ...И, системный DMA, поэтому, = только ЧИТАТЕЛЬ!!!

    А вот GTIA (Graphics Television Interface Adapter), это = переходник, просто - ЦАП!
    - Сильно усовершенствованный, кстати...
    Оцвечивает графику самостоятельно (по возможности) и может PMG отрисовать...
    Просто, у ANTIC оказалось ещё аж ДВА неиспользуемых канала DMA (для Игроков и Ракет) и это и есть изначальная суть PMG. (В смысле обработки она ведёт себя так же как PFG.)

    Не заморачиваясь на конкретности, можно сказать, что ANTIC готовит цифровой поток байтов для GTIA, а GTIA готовит потоковый аналоговый сигнал для TV.

    И теперь, что мы имеем с гуся?
    1. Регистры управлением Чипами
    2. Регистры, дающие нам инфо
    и фантазию...

    Нажмите на изображение для увеличения. 

Название:	Видеопамять Демки.jpg 
Просмотров:	128 
Размер:	25.1 Кб 
ID:	64711
    Нажмите на изображение для увеличения. 

Название:	Распределение памяти в Атари.jpg 
Просмотров:	142 
Размер:	23.6 Кб 
ID:	64712
    Нажмите на изображение для увеличения. 

Название:	Позиционирование PMG.jpg 
Просмотров:	138 
Размер:	22.3 Кб 
ID:	64713
    Нажмите на изображение для увеличения. 

Название:	Управление DMA.jpg 
Просмотров:	149 
Размер:	21.4 Кб 
ID:	64714
    Нажмите на изображение для увеличения. 

Название:	Память PMG.jpg 
Просмотров:	130 
Размер:	21.7 Кб 
ID:	64715

    Теперь мы - системщики!
    Наша машинка(PMG) работает сама, но данные получает с помошью DMA из памяти.
    Памяти игроков или памяти ракет.
    Мы, обязательно создадим её... Присущую нам PMG!

    Займёмся ОГРАНИЧЕНИЯМИ:
    1. ANTIC умеет читать данные из памяти только:
    - с границы 2k - для SLR(Single Line Resolution)
    - с границы 1k - для DLR(Double Line Resolution)
    2. GTIA имеет только 3-bit шину связи с ANTIC...
    ЭТО ЗНАЧИТ,
    - при приёме потока в виде ДАННЫХ, = просто 1 байт. (Ограничение по размеру Игрока 0-7 битов)
    - при приёме потока как АДРЕСА, 1 байт адресует 256 байтов пространства. (0-255 байтов в видеобуфере по X или Y)

    Для отрисовки PFG в регистре SDMCTL(System Direct Memory Control) управления DMA изначально включены:
    - Бит включения DL DMA
    - Биты размера PFG (Узкое, Нормальное, Широкое поле графики)

    Также есть:
    - Бит включения DMA для Игроков
    - Бит включения DMA для Ракет
    - Бит вертикального разрешения (Нормально=DLR) Двойная-Одинарная линия сканирования на экране TV.

    Заодно, стоит отметить, что также как и в GR.0, в PMG горизонтальное разрешение составляет 2 бита (как ширина вертикальных линий у букв).

    Ну, и теперь радостное...
    Атари совершенно НИЧЕГО не знает о PMG, так как это просто видеооверлей!!!
    Если Вы правильно выведете на экран PMG, Атари сможет убрать его только софт или колд ресетом.

    ПРОЕКТИРОВАНИЕ:
    1. Так как нам нужен МАЛЫЙ объект графики - стрелка курсора, мы выбираем самые высокие разрешения и по горизонтали и по вертикали.
    То есть - NPW(Normal Player Width) и SLR(Single Line Resolution)

    2. Для SLR мы должны выделить 2к памяти на границе кратной 2к. Неважно где, но если хотите работать с ДОСом, то лучше сверху, чтобы не повышать LOMEM.

    3. Где-то в памяти задать имидж игрока для автоматического его считывания при помощи DMA.
    Моя стрелка курсора такая: (системно будет удвоена по ширине и станет КРАСИВШЕ!)
    %Ж_______
    %_ЖЖ_____
    %_ЖЖЖЖ___
    %__ЖЖЖЖЖ_
    %__ЖЖЖЖ__
    %___ЖЖЖ__
    %___Ж__Ж_
    %_______Ж

    4. Инициализировать всё для DMA в SDMCTL

    5. Разрешить отрисовку данных из DMA в оверлей (DMA = только ЧИТАТЕЛЬ!) в GRACTL.
    2 = отрисовывает только Игроков, 3 = отрисовывает и Игроков и Ракеты.

    GRACTL, фактически и запустит то, что ребятишки называют системой PMG.
    Последний раз редактировалось ezswift; 22.03.2018 в 13:21. Причина: Унификация определений
    MAC и PC - это всего лишь периферия для Атари...
    130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|

  9. #8
    Guru Аватар для Shiny
    Регистрация
    19.01.2017
    Адрес
    г. Арзамас
    Сообщений
    2,121
    Записей в дневнике
    36
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    21
    Поблагодарили
    10 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ezswift Посмотреть сообщение
    Что же включено в систему для прорисовки PMG?
    Правильно, Ничего!

    Делаем главный вывод: - ЭТО НЕСИСТЕМНАЯ ФУНКЦИЯ графического сопроцессора!

    То есть программист PMG должен быть системщиком. А системщик знает массу бяков:
    Ваши речи иногда зажигательны

  10. #9
    Activist Аватар для ezswift
    Регистрация
    26.02.2011
    Адрес
    Москва
    Сообщений
    258
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    25
    Поблагодарили
    18 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Демка

    Вот текст Демки:
    Код:
    ; pl0.com
    ; Draws player above working DOS screen
            .ou pl0.com
    ; ====================
    ; Z-page Variables
    zppy    =   $cc           ; Z-page pointer for y
    zppx    =   $ce           ; Z-page pointer for x
    xini    =   $d0           ; initial x value
    yini    =   $d1           ; initial y value
    ; --------------------
    ; Included LIBS
            .in syseq.mae
            .in pmgeq.mae
            .in macro.mae
    ; --------------------
    ; Variables
    stotop  =   $100          ; storage (adress)
    
    ; ====================
    ; Main PROG
            .or $0600
    start
    ; --------------------
    ; Bump Down RAMTOP
            mab RAMTOP stotop ; Save old RAMTOP
            sec
            sbc #$08
            sta RAMTOP        ; Set new RAMTOP
            sta PMBASE        ; Tell ANTIC
            sta 1+zppx        ; for erase SUBR
            mib 0 zppx
    ; --------------------
    ; Reset GR mode immediately
            ofs 6
            bfa sname
            lda GRMODE
            jsr setgr
    ; --------------------
    ; Init player/missile graphics
            mib 126 xini
            mib 128 yini
            mib $3a SDMCTL    ; Set SLR,PLDMA=on
    ; --------------------
    ; Clear out pm area of ram
            ldy #0            ; Reverse counter
    erase
            lda #0            ; Eraser byte
            sta (zppx),y
            dey               ; 255->0 counter
            bne erase         ; Wait for 0 in counter
            inc 1+zppx        ; Set next page
            lda 1+zppx        ; Here checks are we done?
            cmp stotop        ; Are we on old RAMTOP?
            beq erase         ; Yes! Clear it from 255->0
            bcc erase         ; No! Continue...
    ; --------------------
    ; Calculate y position
            lda RAMTOP
            clc
            adc #4            ; Go to P0 page in SLR
            sta 1+zppy        ; Set up P0 area
            mab yini zppy     ; y-pos = offset from P0
    ; Draw shape
            ldy #0            ; Normal counter
    draw
            lda shape,y       ; get byte of shape
            sta (zppy),y      ; put it in place
            iny
            cpy #shlen
            bne draw
            mab xini HPOSP0
            sta zppx
            mib $0e PCOLR0    ; Not Utilized!
    ; Color needed to be refreshed every VBI!
            mib $02 GRACTL
    ;
            rts ; Return to DOS
    ; ====================
    ; Used Subroutines
    
    ; --------------------
    ; Set Up Graphics Mode
    setgr
            pha ; Mode
            jsr close
            pla
            tay               ; Y=Opt (AUX1)
            and #16+32        ; TXTWIN+NoClear
            eor #16           ; flip TXTWIN
            ora #OPUPD        ; Open rw
            jmp open
    
    ; --------------------
    ; Included SUBS
            .in iolib.mae
    ; Needed data
    sname   .by "S:",$9b
    shape   .by %10000000
            .by %01100000
            .by %01111000
            .by %00111110
            .by %00111100
            .by %00011100
            .by %00010010
            .by %00000001
    shlen   = *-shape-1
    ; ====================
    ; Setup Run Address
            .or RUNAD
            .wo start
    ;
            .en
    ; >>> End Of File <<< ;
    А во вложении образ диска Атари с MAE Macroassembler и моими библиотеками.
    MAE Assembler SpDOSx33a 360.zip

    А вот и рисуночек:
    Нажмите на изображение для увеличения. 

Название:	PMG_and_Scrolling_ DIR.jpg 
Просмотров:	162 
Размер:	24.6 Кб 
ID:	64717

    - - - Добавлено - - -

    Цитата Сообщение от Шынни Посмотреть сообщение
    Ваши речи иногда зажигательны
    Хочется писать интересно даже о структуре веника...
    И моё занудство можно рассматривать (при перенормировке координат) как лаконичность, только наоборот.

    Меня всегда удручало то, что во всех руководствах про PMG специально скрыты его корни.
    Даются либо общие правила "ходи туда, клади что взял", либо описываются сверхподробные шажки, абсолютно несистемные, а их же куча!
    В общем, PMG - это непросто.
    Последний раз редактировалось ezswift; 22.03.2018 в 13:35.
    MAC и PC - это всего лишь периферия для Атари...
    130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|

  11. #10
    Guru Аватар для Shiny
    Регистрация
    19.01.2017
    Адрес
    г. Арзамас
    Сообщений
    2,121
    Записей в дневнике
    36
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    21
    Поблагодарили
    10 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    PMG весело, да. Когда у нас в городе Атарями заведовал кооператив "Формат", то выдавить инфу о спрайтах удалось только с помощью жесткого троллинга.

    насчет мыши: было бы хорошо, если бы она была приспособлена к Koala(есть версия для джойстик), или, например, сделать подобие текстового редактора: клик кнопкой - перенос курсора, даже в Бейсике.

Страница 1 из 2 12 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Атари ассемблер
    от atariki в разделе Atari
    Ответов: 220
    Последнее: 31.03.2022, 07:41
  2. Эмуляция мыши на джойстика
    от Граф Куракин в разделе Поиск
    Ответов: 4
    Последнее: 19.10.2013, 14:07
  3. Чувствительность Kempston мыши
    от wally в разделе Устройства ввода
    Ответов: 7
    Последнее: 21.12.2006, 11:43
  4. кнопки мыши в BGE 3.05
    от SaaB в разделе Графика
    Ответов: 8
    Последнее: 04.03.2006, 16:53
  5. Подключение кемпстон мыши
    от Aprisobal в разделе Устройства ввода
    Ответов: 14
    Последнее: 10.02.2005, 15:04

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •