User Tag List

Страница 12 из 45 ПерваяПервая ... 8910111213141516 ... ПоследняяПоследняя
Показано с 111 по 120 из 443

Тема: Пишу шедевр для «Вектора 06Ц»

  1. #111

    Регистрация
    24.08.2012
    Адрес
    г. Волжский
    Сообщений
    464
    Спасибо Благодарностей отдано 
    792
    Спасибо Благодарностей получено 
    273
    Поблагодарили
    105 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вот вывод графики через стек пробовал - в целом работет но есть артефакты на экране

    Скрытый текст



    ; универсальный вывод трети спрайта для затирания пустого места

    SpriteC8zerowww:

    PUSH H
    PUSH D
    PUSH B
    PUSH PSW

    MOV A,H ; сохраняем начало столбик X плоскость (1) куда выводим графику
    STA pozic_xP1
    ADI 20H ; вычисляем следующую плоскость (2) начальный столбец
    STA pozic_xP2 ; сохраняем
    ADI 20H ; вычисляем следующую плоскость (3) начальный столбец
    STA pozic_xP3 ; сохраняем
    MOV D,L
    ;=======================
    LXI H,0 ; ВЫВОД "ПУСТОГО" СПРАЙТА. (СДЕЛАН ОТДЕЛЬНО ПО
    DAD SP ; БЫСТРОМУ АЛГОРИТМУ ДЛЯ ПОВЫШЕНИЯ БЫСТРОДЕЙСТВИЯ).
    SHLD BUFSP
    DI
    LXI B,00h

    LDA pozic_xP1
    MOV H,A ; установка первого столбца X плоскость (1) куда выводим графику
    MOV L,D
    SPHL
    PUSH B
    PUSH B
    PUSH B
    PUSH B
    INR H
    SPHL
    PUSH B
    PUSH B
    PUSH B
    PUSH B
    INR H
    SPHL
    PUSH B
    PUSH B
    PUSH B
    PUSH B

    LDA pozic_xP2
    MOV H,A ; установка первого столбца X плоскость (1) куда выводим графику
    MOV L,D
    SPHL
    PUSH B
    PUSH B
    PUSH B
    PUSH B
    INR H
    SPHL
    PUSH B
    PUSH B
    PUSH B
    PUSH B
    INR H
    SPHL
    PUSH B
    PUSH B
    PUSH B
    PUSH B

    LDA pozic_xP3
    MOV H,A ; установка первого столбца X плоскость (1) куда выводим графику
    MOV L,D
    SPHL
    PUSH B
    PUSH B
    PUSH B
    PUSH B
    INR H
    SPHL
    PUSH B
    PUSH B
    PUSH B
    PUSH B
    INR H
    SPHL
    PUSH B
    PUSH B
    PUSH B
    PUSH B

    LHLD BUFSP
    SPHL
    EI
    POP PSW
    POP B
    POP D
    POP H

    RET
    [свернуть]


    А что это за метод Медногова ?

  2. #112

    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    4,867
    Спасибо Благодарностей отдано 
    328
    Спасибо Благодарностей получено 
    311
    Поблагодарили
    235 сообщений
    Mentioned
    12 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от metamorpho Посмотреть сообщение
    Вот вывод графики через стек пробовал - в целом работет но есть артефакты на экране

    Скрытый текст



    ; универсальный вывод трети спрайта для затирания пустого места

    SpriteC8zerowww:

    PUSH H
    PUSH D
    PUSH B
    PUSH PSW

    MOV A,H ; сохраняем начало столбик X плоскость (1) куда выводим графику
    STA pozic_xP1
    ADI 20H ; вычисляем следующую плоскость (2) начальный столбец
    STA pozic_xP2 ; сохраняем
    ADI 20H ; вычисляем следующую плоскость (3) начальный столбец
    STA pozic_xP3 ; сохраняем
    MOV D,L
    ;=======================
    LXI H,0 ; ВЫВОД "ПУСТОГО" СПРАЙТА. (СДЕЛАН ОТДЕЛЬНО ПО
    DAD SP ; БЫСТРОМУ АЛГОРИТМУ ДЛЯ ПОВЫШЕНИЯ БЫСТРОДЕЙСТВИЯ).
    SHLD BUFSP
    DI
    LXI B,00h

    LDA pozic_xP1
    MOV H,A ; установка первого столбца X плоскость (1) куда выводим графику
    MOV L,D
    SPHL
    PUSH B
    PUSH B
    PUSH B
    PUSH B
    INR H
    SPHL
    PUSH B
    PUSH B
    PUSH B
    PUSH B
    INR H
    SPHL
    PUSH B
    PUSH B
    PUSH B
    PUSH B

    LDA pozic_xP2
    MOV H,A ; установка первого столбца X плоскость (1) куда выводим графику
    MOV L,D
    SPHL
    PUSH B
    PUSH B
    PUSH B
    PUSH B
    INR H
    SPHL
    PUSH B
    PUSH B
    PUSH B
    PUSH B
    INR H
    SPHL
    PUSH B
    PUSH B
    PUSH B
    PUSH B

    LDA pozic_xP3
    MOV H,A ; установка первого столбца X плоскость (1) куда выводим графику
    MOV L,D
    SPHL
    PUSH B
    PUSH B
    PUSH B
    PUSH B
    INR H
    SPHL
    PUSH B
    PUSH B
    PUSH B
    PUSH B
    INR H
    SPHL
    PUSH B
    PUSH B
    PUSH B
    PUSH B

    LHLD BUFSP
    SPHL
    EI
    POP PSW
    POP B
    POP D
    POP H

    RET
    [свернуть]


    А что это за метод Медногова ?
    это у тебя не вывод спрайта, это у тебя стирание спрайта.

    метод Медноногова состоит в том чтобы контролировать регистровую пару содержащую данные и контролировать стек на прерываниях.

    прерывание выглядит так
    надеюсь ты умеешь код Z80


    Код:
    ISR
             di
             ex (sp),hl       ;забираем в hl адрес возврата 
             ld  (isr_jmp),hl ;сохраняем его для выхода 
             pop hl            ;восстанавливаем hl
    ;здесь надо сохранить стек
             ld (isr_stek),sp ;это для Z80 у тебя будет чуть по другому
    ;--------------------------
             push bc           ;ВСЕГДА используем BC для рисования спрайтов и прочих элементов
                                  ;восстанавливаем данные на стеке 
    ;скорее всего рисовать через стек на экране не будет очень хорошей идеей.
    
             ld     sp,isr_own_stek 
             push hl,de,bc,af
    
    ;дальше прерываем 
    
            pop af,bc,de,hl
            ld sp,$
    isr_stek equ $-2
            ei 
            jp $
    isr_jmp equ $-2
    при рисовании спрайта всегда использовать BC

    например
    Код:
    ;hl адрес спрайта
    ;de адрес на экране
         
    ;первую пару забираем вот такой комбинацией
              ld c,(hl)
              inc hl
              ld b,(hl)
              inc hl        
              ld sp,hl
              ex de,hl
    
              ld (hl),c
              inc l
              ld (hl),b
              inc l
              pop bc
           
              etc
    С уважением,
    Jerri / Red Triangle.

    Этот пользователь поблагодарил jerri за это полезное сообщение:

    metamorpho(21.07.2020)

  3. #113

    Регистрация
    20.06.2007
    Адрес
    С.-Петербург
    Сообщений
    4,307
    Спасибо Благодарностей отдано 
    1,032
    Спасибо Благодарностей получено 
    818
    Поблагодарили
    489 сообщений
    Mentioned
    26 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я попробовал по быстрому вставить в рыбу с гиббоном, у меня рисуется черный прямоугольник. По тексту я тоже навскидку ничего особенного не вижу. Видимо причина артефактов где-то еще.
    Больше игр нет

    Этот пользователь поблагодарил svofski за это полезное сообщение:

    metamorpho(21.07.2020)

  4. #114

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,393
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,367
    Поблагодарили
    1,317 сообщений
    Mentioned
    39 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Быстрый вывод спрайтов - это хорошо, но я бы в первую очередь попробовал уменьшить моргания спрайта. Код я не видел, но могу предположить, что при движении спрайт сначала стирается полностью, потом полностью рисуется на новом месте. Если наложение спрайтов не планируется (или этот случай можно отрабатывать отдельно), то лучше стирать только там, где спрайта уже нет (или не будет), а там где он будет - не стирать, а сразу выводить.
    Второй момент - у меня по видео создалось впечатление, что спрайты выводятся по плоскостям (сначала одна, потом вторая и т.д.). Так быстрее, но ввиду невозможности сделать двойную буферизацию я бы лучше сделал вывод сразу в три плоскости, это намного уменьшит вероятность заметности этапов прорисовки. Как примерно можно сделать:
    1. Запрещаем прерывания (метод Медноногова тут не поможет, регистров не хватает), сохраняем стек.
    2. Формируем в BC, DE и HL адреса трех плоскостей.
    3. Выводим примерно так (8 точек с 8 цветами): pop psw\ dcx sp\ stax b\ dcr c\ pop psw\ dcx sp\ stax d\ dcr e\ pop psw\ dcx sp\ mov m,a\ dcr l
    Это не самый быстрый вариант в принципе, но самый быстрый с "почти одновременным" выводом в три плоскости.
    4. Возвращаем стек, разрешаем прерывания.

    Если фоновая музыка с AY или ВИ53 не планируется, то в запрете прерываний проблем нет.

    Этот пользователь поблагодарил ivagor за это полезное сообщение:

    metamorpho(21.07.2020)

  5. #115

    Регистрация
    22.02.2014
    Адрес
    г. Курган
    Сообщений
    1,706
    Спасибо Благодарностей отдано 
    275
    Спасибо Благодарностей получено 
    318
    Поблагодарили
    222 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Мне кажется, что если спрайты часто выводятся не полностью, а частями по 8 строк (например), то и хранить их можно в соответствующем (оптимизированном) виде.
    А при выводе спрайта на экран использовать стек не для переноса на экран, а для чтения спрайта. Тогда переносить указатель стека не нужно, а пересчитывать значение пары HL значительно проще и быстрее (DAD D), задал смещение на новую плоскость и получил один поток переноса в 72 байта (8 строк, 3 плоскости, 3 столбца) в 3 захода... ведь переход с последней плоскости на первую в новый столбец тоже можно смещением задать...
    Последний раз редактировалось KTSerg; 21.07.2020 в 07:37.

    Этот пользователь поблагодарил KTSerg за это полезное сообщение:

    metamorpho(21.07.2020)

  6. #116

    Регистрация
    24.08.2012
    Адрес
    г. Волжский
    Сообщений
    464
    Спасибо Благодарностей отдано 
    792
    Спасибо Благодарностей получено 
    273
    Поблагодарили
    105 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    jerri, svofski, ivagor, KTSerg спасибо за советы, тесты и исследования !!

    У меня спрайты выводятся по плоскостям, сначала в первую, потом вторую и третью.
    Вод код вывода спрайта, который я использую (сейчас тоже самое, но развернул циклы)

    Скрытый текст



    ;Вывод квадратика 24x24 точки в три плоскости для статичных объектов
    ;
    SpriteC3:
    PUSH H
    PUSH D
    PUSH B
    MOV A,H ; сохраняем начало столбик X плоскость (1) куда выводим графику
    STA pozic_xP1
    ADI 20H ; вычисляем следующую плоскость (2) начальный столбец
    STA pozic_xP2 ; сохраняем
    ADI 20H ; вычисляем следующую плоскость (3) начальный столбец
    STA pozic_xP3 ; сохраняем

    MOV A,L ; сохраняем начало строки Y куда выводим графику
    STA pozic_y

    MVI B,3 ;в регистр "B" - счетчик столбиков X
    Kvadr1:MVI C,24 ;в регистр "C" - счетчик строк Y
    Kvadr2: LDAX D ; загружаем акумулятор А содержимым графики
    MOV M,A ; выводим в экран по адресу "HL" байт графики
    DCR L ; ; куда выводить "HL=HL+1" строка Y +1
    INX D ; DE=DE+1 увеличиваем адрес откуда брать графику
    DCR C ; -1 все 24 байт строки вывели ?
    JNZ Kvadr2 ;если столбик не вывели полностью то продолжаем
    ; переключаем на следующий столбик-адрес вывода графики
    INR H
    LDA pozic_y
    MOV L,A ; установка Y начала строки
    DCR B ; -1 все 3 столбика X вывели ?
    JNZ Kvadr1 ;если столбики не вывели полностью то продолжаем

    ;============== вывод в плоскость 2
    LDA pozic_xP2
    MOV H,A ; установка первого столбца X плоскость (2) куда выводим графику

    MVI B,3 ;в регистр "B" - счетчик столбиков X
    Kvadr11:MVI C,24 ;в регистр "C" - счетчик строк Y
    Kvadr22: LDAX D ; загружаем акумулятор А содержимым графики
    MOV M,A ; выводим в экран по адресу "HL" байт графики
    DCR L ; ; куда выводить "HL=HL+1" строка Y +1
    INX D ; DE=DE+1 увеличиваем адрес откуда брать графику
    DCR C ; -1 все 24 байт строки вывели ?
    JNZ Kvadr22 ;если столбик не вывели полностью то продолжаем
    ; переключаем на следующий столбик-адрес вывода графики
    INR H
    LDA pozic_y
    MOV L,A ; установка Y начала строки
    DCR B ; -1 все 3 столбика X вывели ?
    JNZ Kvadr11 ;если столбики не вывели полностью то продолжаем

    ;============== вывод в плоскость 3
    LDA pozic_xP3
    MOV H,A ; установка первого столбца X плоскость (2) куда выводим графику

    MVI B,3 ;в регистр "B" - счетчик столбиков X
    Kvadr111:MVI C,24 ;в регистр "C" - счетчик строк Y
    Kvadr222: LDAX D ; загружаем акумулятор А содержимым графики
    MOV M,A ; выводим в экран по адресу "HL" байт графики
    DCR L ; ; куда выводить "HL=HL+1" строка Y +1
    INX D ; DE=DE+1 увеличиваем адрес откуда брать графику
    DCR C ; -1 все 24 байт строки вывели ?
    JNZ Kvadr222 ;если столбик не вывели полностью то продолжаем
    ; переключаем на следующий столбик-адрес вывода графики
    INR H
    LDA pozic_y
    MOV L,A ; установка Y начала строки
    DCR B ; -1 все 3 столбика X вывели ?
    JNZ Kvadr111 ;если столбики не вывели полностью то продолжаем

    POP B
    POP D
    POP H
    RET ;иначе - выйти из п/п вывода квадратиков
    [свернуть]


    В движении спрайты у меня не стираются полностью, на старый спрайт накладывается новый со смещением затирая старый.

    ivagor, да спрайты я тоже заметил немного моргают. Вывод сразу в три плоскости очень оригинально сделан, попробую воплотить идею, если это уменьшит моргание и не снизит сильно скорость, то будет здорово.

    Фоновой музыки не планирую, но звуки будут. А звукам не помешает запрет прерываний ?

  7. #117

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,393
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,367
    Поблагодарили
    1,317 сообщений
    Mentioned
    39 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от metamorpho Посмотреть сообщение
    В движении спрайты у меня не стираются полностью, на старый спрайт накладывается новый со смещением затирая старый.
    Меня смущает, что помаргивает даже когда стоит на месте, в принципе не должно быть так заметно.
    В chipndale все выводится тайлами 8x8 из буфера и там я особо не замечал морганий/миганий, хотя там вывод по плоскостям. Если выводить по плоскостям 24x24 точки, то вероятность увидеть моргание или артефакты плоскостной прорисовки гораздо больше. Т.е. еще один компромиссный вариант (без стека и "одновременного трехплоскостного" вывода) - рисовать по тайлам 8x8.

    Цитата Сообщение от metamorpho Посмотреть сообщение
    А звукам не помешает запрет прерываний ?
    Если звук запускается и глушится в прерывании - то помешает.

    Этот пользователь поблагодарил ivagor за это полезное сообщение:

    metamorpho(21.07.2020)

  8. #118

    Регистрация
    20.06.2007
    Адрес
    С.-Петербург
    Сообщений
    4,307
    Спасибо Благодарностей отдано 
    1,032
    Спасибо Благодарностей получено 
    818
    Поблагодарили
    489 сообщений
    Mentioned
    26 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Перемежение плоскостей по методу ivagor-a делает вывод спрайтов нечувствительным к положению луча на момент отрисовки, это по-моему самый робастный способ. Альтернатива -- это синхронизация с ходом луча, но в игре где много спрайтов это тяжело делать. Снимаю плащ КО.

    Мы все очень впечатлились почином metamorpho и бросились критиковать и чинить микропроблемы, может быть преждевременно. Когда игра будет почти готова, и так будет очевидно где надо экономить и чинить, а где нет смысла тратить силы попусту. Пока по-моему все очень круто. metamorpho, спасибо, что не маринуешь прогресс! Смотреть очень интересно.
    Больше игр нет

    Этот пользователь поблагодарил svofski за это полезное сообщение:

    metamorpho(21.07.2020)

  9. #119

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,393
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,367
    Поблагодарили
    1,317 сообщений
    Mentioned
    39 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от metamorpho Посмотреть сообщение
    ;Вывод квадратика 24x24 точки в три плоскости для статичных объектов
    Все же процедура только для статичных или и для подвижных объектов (ГГ)?

    Цитата Сообщение от svofski Посмотреть сообщение
    Когда игра будет почти готова, и так будет очевидно где надо экономить и чинить, а где нет смысла тратить силы попусту.
    Не обязательно все сразу чинить, но желательно сразу определить проблемные места и прикинуть методы их решения или хотя бы понять, можно ли в принципе починить. Графика в игрушке мне нравится, однозначный респект, но вот помаргивания (лично для меня) сильно портят впечатление. Слишком много я видел векторовских игрушек, в которых даже при нормальной графике спрайты моргали и мигали.

    Этот пользователь поблагодарил ivagor за это полезное сообщение:

    metamorpho(21.07.2020)

  10. #120

    Регистрация
    20.06.2007
    Адрес
    С.-Петербург
    Сообщений
    4,307
    Спасибо Благодарностей отдано 
    1,032
    Спасибо Благодарностей получено 
    818
    Поблагодарили
    489 сообщений
    Mentioned
    26 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Тут главное стараться делать так, чтобы в случае положения проекта в долгий ящик, было бы понятно с какой стороны к нему подойти. Конечно, к немигающим спрайтам возвращаться приятно.
    Больше игр нет

    Этот пользователь поблагодарил svofski за это полезное сообщение:

    metamorpho(21.07.2020)

Страница 12 из 45 ПерваяПервая ... 8910111213141516 ... ПоследняяПоследняя

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

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

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

Похожие темы

  1. Бейсики для Вектора-06Ц и клонов
    от ivagor в разделе Вектор
    Ответов: 696
    Последнее: 25.10.2025, 02:34
  2. Картотека ПО для Вектора-06ц
    от svofski в разделе Вектор
    Ответов: 719
    Последнее: 04.04.2024, 11:13
  3. Восстановление Вектора-06ц
    от Daniil Chislov 86 в разделе Вектор
    Ответов: 100
    Последнее: 11.03.2021, 00:23
  4. Ответов: 198
    Последнее: 26.04.2020, 13:05
  5. Ответов: 58
    Последнее: 06.07.2019, 23:56

Ваши права

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