Исследуя исходники Лебедева, а именно его способ вывода спрайта, заметил что он
вначале подпрограммы вывода спрайта запрещает прерывания, а в конце снова их разрешает.
Чем грозит запрет прерываний в основном цикле игры ?
Исследуя исходники Лебедева, а именно его способ вывода спрайта, заметил что он
вначале подпрограммы вывода спрайта запрещает прерывания, а в конце снова их разрешает.
Чем грозит запрет прерываний в основном цикле игры ?
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Это зависит от основного цикла игры. Если он синхронный с разверткой и укладывается целиком во время одного кадра, то ничем, потому что прерывание не случится когда его не ждут. Если стек используется как канонический стек, а не как ухищрение для быстрой пересылки памяти, то тоже практически ничем - прерывание обработается и исполнение продолжится где прервалось. Плохо, если синхронности нет, прерывания разрешены, а стек используется для пересылки данных. Тогда может возникнуть незапланированная ситуация.
Больше игр нет
metamorpho(20.07.2020)
Настроил палитру на 8 цветов (три плоскости).
Подправил графику.
Пытался сделать вывод спрайта через стек - при этом начинает глючить верхняя ширма и ещё на экране появляется немного мусора.
Решил делать оптимизацию без использования стека - разворачиваю циклы и убираю лишнее.
Уже переделал одну подпрограмму вывода пустого спрайта - работает без мусора на экране, хотя по сути тоже самое что и со стеком пробовал писать. Не понимаю почему со стеком не получается.
metamorpho, а давай попробуем без запретов прерываний методом Медногова
как ты выводишь графику?
С уважением,
Jerri / Red Triangle.
Вот вывод графики через стек пробовал - в целом работет но есть артефакты на экране
Скрытый текст
; универсальный вывод трети спрайта для затирания пустого места
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
при рисовании спрайта всегда использовать BCКод: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
например
Код:;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.
metamorpho(21.07.2020)
Я попробовал по быстрому вставить в рыбу с гиббоном, у меня рисуется черный прямоугольник. По тексту я тоже навскидку ничего особенного не вижу. Видимо причина артефактов где-то еще.
Больше игр нет
metamorpho(21.07.2020)
Быстрый вывод спрайтов - это хорошо, но я бы в первую очередь попробовал уменьшить моргания спрайта. Код я не видел, но могу предположить, что при движении спрайт сначала стирается полностью, потом полностью рисуется на новом месте. Если наложение спрайтов не планируется (или этот случай можно отрабатывать отдельно), то лучше стирать только там, где спрайта уже нет (или не будет), а там где он будет - не стирать, а сразу выводить.
Второй момент - у меня по видео создалось впечатление, что спрайты выводятся по плоскостям (сначала одна, потом вторая и т.д.). Так быстрее, но ввиду невозможности сделать двойную буферизацию я бы лучше сделал вывод сразу в три плоскости, это намного уменьшит вероятность заметности этапов прорисовки. Как примерно можно сделать:
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 не планируется, то в запрете прерываний проблем нет.
metamorpho(21.07.2020)
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)