User Tag List

Показано с 1 по 10 из 217

Тема: ROBOTZ! Releases

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    4,866
    Спасибо Благодарностей отдано 
    328
    Спасибо Благодарностей получено 
    310
    Поблагодарили
    234 сообщений
    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.

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

  3. #2

    Регистрация
    01.03.2011
    Адрес
    Stamford
    Сообщений
    336
    Спасибо Благодарностей отдано 
    46
    Спасибо Благодарностей получено 
    49
    Поблагодарили
    20 сообщений
    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> будет значение из ОЗУ, а не из банка памяти.

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

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

  4. #3

    Регистрация
    06.05.2019
    Адрес
    г. Подольск
    Сообщений
    108
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    18
    Поблагодарили
    13 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от jerri Посмотреть сообщение
    если внезапно придет прерывание то спрайт будет испорчен
    Код:
               ld (imm_jp),hl
               pop hl       ;заменяем испорченное слово спрайта 
               push bc     ;на текущее слово находящееся в BC
               ld (imm_sp),sp
              
               ld sp,ISR_sp
    Правильно будет может так?

    Код:
               ld (imm_jp),hl
               pop hl       ;заменяем испорченное слово спрайта 
    
                 ld (imm_sp),sp
    
               push bc     ;на текущее слово находящееся в BC
              
               ld sp,ISR_sp
    Ведь заходим в прерывание по CALL, а выходим по JP. Значит SP при выходе из прерывания будет SP = SP - 2.

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

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

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

Ваши права

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