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

User Tag List

Страница 15 из 22 ПерваяПервая ... 111213141516171819 ... ПоследняяПоследняя
Показано с 141 по 150 из 217

Тема: ROBOTZ! Releases

  1. #141
    Activist Аватар для PPC
    Регистрация
    01.03.2011
    Адрес
    Stamford
    Сообщений
    335
    Спасибо Благодарностей отдано 
    46
    Спасибо Благодарностей получено 
    42
    Поблагодарили
    18 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Перед тем, как приступить к тотальной перекройке рендерера на субтайловый режим, профиксил за выходные всё, что не нравилось, и выкладнываю новую версию 0.58. Floppy disk image и список внесёных изменений в 1м сообщении этой ветки.

    Для тракинга истории changelog 2х предыдущих версий перемещён сюда.

    ------------------
    v. 0.56a 01.07.2014
    ------------------
    Добавлено:
    1. Звуковые эффекты и визуальные эффекты полупрозрачности в меню опций
    2. Дополнительные звуковые эффекты на события в игре
    3. 2-bit 9kHz звуковой DAC драйвер для воспроизведения вокала на i8253
    4. 2-bit 9kHz звуковой DAC драйвер для воспроизведения вокала на Сovox
    5. Инсталляционный скрипт
    Изменено:
    1. Изображение заднего плана в меню опций на "The Guardian" by Nikolai Nazarov
    2. Цвета палитры в главном меню на оттенки серого
    3. Цвета в меню "Read This"

    Теперь в игре есть инсталляционный скрипт install.sub, который запускается автоматически при первой загрузке с диска и устанавливает драйвера, настраивает меню опций и кое-что ещё. При успешной инсталляции скрипт запустит игру и всё должно работать. По умолчанию ставятся следующие драйвера:
    1. Sound Effects - через i8253
    2. Vocal Sound в заставке 2-bit 9kHz DAC driver для i8253.
    возможные альтернативы:
    1-bit 7kHz DAC sound driver через бипер
    2-bit 9kHz DAC driver для Covox
    3. Background Sound - STM через плату Sound Tracker
    возможные альтернативы:
    Background Sound - STM через плату R-Sound 2
    Для того чтобы поменять драйвера на альтернативные, нужно отредактировать инсталляционный файл install.sub, раскомментарив соответствующие строчки, сохранить файл и запустить его из командной строки MicroDOS следующим образом:
    a:<install.sub

    ------------------
    v. 0.57a 02.17.2015
    ------------------
    Изменено:
    1. Звуковые драйверы загружаются многоцветным шрифтом, ядро игры - нормальным
    2. Файлы с вокалом переименованы в boot.sd1 и boot.sd2

    Добавлено:
    1. Драйвер многоцветного шрифта
    2. Для вокальных драйверов, полосы на бордюре промодулированы дополнительным набором полос поверх с разной шириной и цветом в зависимости от громкости звуковой дорожки.

  2. #142
    Guru
    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    7,842
    Спасибо Благодарностей отдано 
    654
    Спасибо Благодарностей получено 
    1,814
    Поблагодарили
    1,043 сообщений
    Mentioned
    22 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Мелкая имха по поводу темпов музыки - самые быстрые как-то уж очень-очень быстры

  3. #143
    Activist Аватар для PPC
    Регистрация
    01.03.2011
    Адрес
    Stamford
    Сообщений
    335
    Спасибо Благодарностей отдано 
    46
    Спасибо Благодарностей получено 
    42
    Поблагодарили
    18 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ivagor Посмотреть сообщение
    Мелкая имха по поводу темпов музыки - самые быстрые как-то уж очень-очень быстры
    На самом деле, опции, управляющей темпом там быть вообще не должно. Это опция-временный костыль, за который мне в общем-то стыдно, о чём я недвусмысленно написал в комментах к этому куску кода.

    В зависимости от сложности уровня, (геометрия, количество обрабатываемых событий, etc.), время на рендеринг картинки уходит разное. На самом деле, разные фреймы также занимают не одинаковое время: в каких-то фреймах обрабатываются включившиеся по триггерам события, или просто есть вывод тайлов переднего плана с альфа каналом (дорогое удовольствие). Кроме этого, нужно ещё учитывать тип процессора и тактовую частоту. Всё бежит неуклюже с запрещёнными прерываниями.

    Я делал вариант, который бежит, в основном, с разрешёнными прерываниями, но управление их разрешением и запрещением отнимает драгоценные такты. Ясно, что когда идёт вывод тайла стеком из банка, прерывания нужно запретить, потом - снова разрешить так как к этому времени, вполне может натикать interrupt request. Потом-снова запретить для следующего тайла, и так - до бесконечности. В общем, кадр в секунду на этом теряется так как мест, где это надо делать за фрейм набегает много . В принципе, я оставил возможность к такому варианту вернуться: в коде библиотеки GML есть такой conditional O_DION, и надо просто поглядеть, где он используется для разрешения прерываний.

    Канал таймера, как в порте Exolon, мне терять было жаль: звуковые эффекты на таймере и так бедноваты, а с двумя каналами, будет ещё хуже.

    Видится вот такой более-менее сносный вариант: при старте уровня, проверить, используется ли таймер каким-нибудь из драйверов (сейчас это SFX драйвер), и временно, этот драйвер вырубить на некоторое количество фреймов, чтобы дать возможность рендереру пробежать с разными кадрами. За время пробега, измерить, сколько "абстрактных тайлов" укладывается в прерывание с учётом обработки событий, триггеров и отрисовки оверлеев/спрайтов. Это среднее использовать как счётчик тайлов при выводе. Ясно, что это-средняя температура по больнице (какой-нибудь спрайт с NPC, или большой оверлей внесёт тормоза), но пока лучшей идеи у меня нет.

    Заниматься этим всем мне не очень хотелось, поэтому просто вставил примитивный костыль с задержками (которые ешё и криво работают при смене CPU или тактовой частоты). Пока могу ввести понятие нижней границы в опцию меню с диапазоном, хотя, особо не очень хочется вот именно этим заниматься сейчас.

  4. #144
    Guru Аватар для jerri
    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    4,752
    Спасибо Благодарностей отдано 
    264
    Спасибо Благодарностей получено 
    279
    Поблагодарили
    207 сообщений
    Mentioned
    12 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    PPC, а если использовать метод Медноногова в работе с прерываниями?
    С уважением,
    Jerri / Red Triangle.

  5. #145
    Activist Аватар для PPC
    Регистрация
    01.03.2011
    Адрес
    Stamford
    Сообщений
    335
    Спасибо Благодарностей отдано 
    46
    Спасибо Благодарностей получено 
    42
    Поблагодарили
    18 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от jerri Посмотреть сообщение
    PPC, а если использовать метод Медноногова в работе с прерываниями?
    Можно чуть раскрыть, в чём суть метода?

  6. #146
    Guru Аватар для jerri
    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    4,752
    Спасибо Благодарностей отдано 
    264
    Спасибо Благодарностей получено 
    279
    Поблагодарили
    207 сообщений
    Mentioned
    12 Post(s)
    Tagged
    0 Thread(s)

    Cool

    Цитата Сообщение от PPC Посмотреть сообщение
    Можно чуть раскрыть, в чём суть метода?
    при выводе спрайтов через стек пара ВС
    через которую рисуем должна всегда соответствовать содержимому стека

    единственное я смутно представляю работу прерываний на Векторе.
    и текст дам в z80 кодировке

    итак работа со спрайтами

    грубо говоря берем простейший вывод спрайта
    через стек

    Код:
    ;hl адрес спрайта
    ;de координата
    
    ld (ret_sp0),sp
     ld sp,hl
     ex de,hl
     pop de
     ld (hl),e
     inc h
     ld (hl),d
     ...
     pop de
     ld (hl),e
     inc h
     ld (hl),d
    
     ld sp,$
    retsp equ $-2
     ret
    если внезапно придет прерывание то спрайт будет испорчен

    Код:
    ;вот это вешаем на прерывание
    ISR_sub
               di
               ex (sp),hl  ;обмениваем вершину стека и содержимое HL
               ld (imm_jp),hl
               pop hl       ;заменяем испорченное слово спрайта 
               push bc     ;на текущее слово находящееся в BC
               ld (imm_sp),sp
              
               ld sp,ISR_sp
    ;здесь идет обработка прерывания
    ;          ...
    ;----------------------------------
               ld sp,$          
    imm_sp equ $-2
               ei
               jp $
    imm_jp equ $-2
    
    ;теперь немного меняем процедуру рисования спрайта
    
    ;hl адрес спрайта
    ;de координата
    
    ld (ret_sp0),sp
    
     ld c,(hl)
     inc hl
     ld b,(hl)
     inc hl
     ld sp,hl
     ex de,hl
     ld (hl),c
     inc h
     ld (hl),b
     ...
     pop bc
     ld (hl),c
     inc h
     ld (hl),b
    
     ld sp,$
    retsp equ $-2
     ret
    теперь даже в случае прихода прерывания искажений спрайта уже не будет
    Последний раз редактировалось jerri; 20.10.2015 в 12:38.
    С уважением,
    Jerri / Red Triangle.

  7. #147
    Activist Аватар для PPC
    Регистрация
    01.03.2011
    Адрес
    Stamford
    Сообщений
    335
    Спасибо Благодарностей отдано 
    46
    Спасибо Благодарностей получено 
    42
    Поблагодарили
    18 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от jerri Посмотреть сообщение
    при выводе спрайтов через стек пара ВС
    через которую рисуем должна всегда соответствовать содержимому стека

    единственное я смутно представляю работу прерываний на Векторе.
    Там обычное кадровое прерывание. Приходит 50 раз в секунду, если прерывания разрешены.

    Спасибо за пример. Подход понятен, но вот так в лоб он на Векторе (в роботах) работать не будет, и свалится вот из-за этого кода:
    Код:
     ld c,(hl)
     inc hl
     ld b,(hl)
    Дело в том, что спрайт (тайл) не лежит в основном ОЗУ Вектора. Он - в одном из 64К банков квазидиска. Доступ туда довольно хитрый: стековые команды типа push, pop, ex (sp),hl работают с памятью квазидиска, в то время как ld reg,(hl) будет работать с основным ОЗУ. Поэтому в <BC> будет значение из ОЗУ, а не из банка памяти.

    Кроме того, прерывание (в общем случае) выполняется с отключёнными банками, в то время как выход из него должен вернуть назад режим адресации соответствующего банка, из которого читается спрайт. Увы, регистра статуса включённого банка в Векторе нет. Есть только регистр управления включения доступа к банку, и чтение из него запрещено. Криволапо в общем. Хотя это всё решаемо.

    В принципе - спасибки, подход навеял на некоторые размышления. Просто вот так, в лоб не выйдет .

  8. #148
    Guru
    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    7,842
    Спасибо Благодарностей отдано 
    654
    Спасибо Благодарностей получено 
    1,814
    Поблагодарили
    1,043 сообщений
    Mentioned
    22 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Очевидное (тупое) решение - запретить прерывания на время задания стека на исходник спрайта (в КД), т.е. EI будет перед первым POP читающим данные спрайта. Наверно можно как-то изящнее

    ---------- Post added at 17:36 ---------- Previous post was at 17:20 ----------

    Кстати, с адаптером z80 Фролова спековский вариант можно использовать практически дословно, т.к. он может читать из КД через ld r,(hl)

    ---------- Post added at 17:55 ---------- Previous post was at 17:36 ----------

    Или так: при старте уровня "закешировать" в основном озу по 2 первых байта из всех актуальных для уровня спрайтов

  9. #149
    Guru Аватар для jerri
    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    4,752
    Спасибо Благодарностей отдано 
    264
    Спасибо Благодарностей получено 
    279
    Поблагодарили
    207 сообщений
    Mentioned
    12 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ivagor Посмотреть сообщение
    Очевидное (тупое) решение - запретить прерывания на время задания стека на исходник спрайта (в КД), т.е. EI будет перед первым POP читающим данные спрайта. Наверно можно как-то изящнее
    ну есть шанс потерять прерывание...

    а так да

    Код:
    di 
    ld sp,hl
    pop bc
    ei

    Кстати, с адаптером z80 Фролова спековский вариант можно использовать практически дословно, т.к. он может читать из КД через ld r,(hl)
    а что за квази диск из которого такие трудности?
    С уважением,
    Jerri / Red Triangle.

  10. #150
    Guru
    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    7,842
    Спасибо Благодарностей отдано 
    654
    Спасибо Благодарностей получено 
    1,814
    Поблагодарили
    1,043 сообщений
    Mentioned
    22 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от jerri Посмотреть сообщение
    di ld sp,hl pop bc ei
    ei можно поставить перед pop bc, ухода на обработчик прерывания после ei не будет. Но вариант с "кешированием" еще лучше (если хватит места в основном озу).
    Квазидиск (или электронный диск, как его в основном называли авторы) - дополнительное озу на 256 Кб, из которых часть доступна обычным образом, а полностью - через стековые операции.

Страница 15 из 22 ПерваяПервая ... 111213141516171819 ... ПоследняяПоследняя

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

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

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

Ваши права

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