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

User Tag List

Показано с 1 по 9 из 9

Тема: Попиксельный скролл на Асме

  1. #1
    Member Аватар для helcril
    Регистрация
    15.12.2009
    Адрес
    Angarsk
    Сообщений
    148
    Благодарностей: 50
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Question Попиксельный скролл на Асме

    Доброго времени суток, камрады!

    Намедни решил поразминать свой изрядно отупевший мозг.
    Инструментом для этого выбрал старый добрый Спектрум, а именно программирование на асме для Спектрума.

    Вдохновившись книжкой "Как написать игру на ассемблере" и разобравшись с парой примеров из сего интересного опуса, задумал написать программку-скроллер.
    Т.к. код (читай алгоритм) , предложенный в книге, моему скудному уму не поддался, то решил написать все с чистого листа (пока используя приемы из этой книги).

    И вроде бы все получилось... Но!
    Заковыка в том, что текст-то мой скроллится, но как только он "проезжает" один экран - ряды пикселов изображения постепенно начинают исчезать.

    В общем, прошу прощения за столь длинное предисловие, теперь - к делу. Вопросы знатокам (или не очень знатокам) таковы:
    1. Как избежать этого безвозвратного сдвига нужных пикселов (я так полагаю, что исчезают они из-за моего совершенно беспредельного их двиганья по памяти)?
    2. Куда они собственно деваются? Т.е. продолжают ли они существовать где-то в памяти во время выполнения моего быдлокода?

    В приложении образ TRD и листинг программы...
    Заранее спасибо за ответ!

    ЗЫ: Слезно прошу изъясняться так, как будто рассказываете что-то дебилу. Желательно с примерами и, как говорится "на пальцах" так как человек я скорее гуманитарного склада, и для меня многие элементарные вещи неочевидны!
    ЗЗЫ: Компилятор - ASAM, Эмулятор - Spectaculator.
    Вложения Вложения

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

  3. #2
    Master Аватар для GM BIT
    Регистрация
    27.11.2008
    Адрес
    Красноярск
    Сообщений
    747
    Благодарностей: 230
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Усли надо чтоб просто уползало добавляем в основной цикл AND A

    loop push hl ; save address

    ld b,8 ; set counter = 8 pixel rows
    scrl1 push bc
    push hl

    AND A ;что бы слева выехал пустой пиксель!!!!!!!!!!!!!!!!!!

    ld b,32 ; set counter = string lenght
    scrl2 rr (hl) ; shift data in memory
    inc l ; next symbol
    djnz scrl2

    pop hl ; recover hl

    inc h ; next pixel row
    pop bc ; recover counter
    djnz scrl1

    pop hl ; recover address
    call pause
    jp loop



    А если нужна ротация строки, то добавляем пару команд

    loop push hl ; save address

    ld b,8 ; set counter = 8 pixel rows
    scrl1 push bc
    push hl

    AND A

    ld b,32 ; set counter = string lenght
    scrl2 rr (hl) ; shift data in memory
    inc l ; next symbol
    djnz scrl2

    pop hl ; recover hl

    jr nc,$+4 ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    set 7,(hl) ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    inc h ; next pixel row
    pop bc ; recover counter
    djnz scrl1

    pop hl ; recover address
    call pause
    jp loop

    эти две команды для того, что если справа есть точка и она заехала за экран то она появляется слева
    Ну что то вроде того

  4. Этот пользователь поблагодарил GM BIT за это полезное сообщение:
    helcril (16.12.2009)

  5. #3
    Member Аватар для helcril
    Регистрация
    15.12.2009
    Адрес
    Angarsk
    Сообщений
    148
    Благодарностей: 50
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Про "AND A" я вроде все понял. И да, строчка "уезжает" как положено.
    Но хочется, чтобы строчка эта крутилась и крутилась.
    Попробовал добавить предложенные вами строчки в программу - заработало!!!
    Поясните, пожалуйста, что это за "$+4" и "set 7,(hl)"? ну всмысле логику работы данного участка кода.
    Спасибо за помощь!
    Последний раз редактировалось helcril; 16.12.2009 в 08:43.

  6. #4
    Master Аватар для GM BIT
    Регистрация
    27.11.2008
    Адрес
    Красноярск
    Сообщений
    747
    Благодарностей: 230
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    jr nc,$+4 - проверяем флаг переноса (или заехала ли правая точка за экран), если его нет то перепрыгиваем следующую команду иначе ставим точку слева в строке командой set 7,(hl)

  7. Этот пользователь поблагодарил GM BIT за это полезное сообщение:
    helcril (17.12.2009)

  8. #5
    Member Аватар для helcril
    Регистрация
    15.12.2009
    Адрес
    Angarsk
    Сообщений
    148
    Благодарностей: 50
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    И снова спасибо, но вот что такое "$+4"? И как это связано с "заездом за экран"?
    Еще вопрос: в вашем треде "Пишем на ассемблере под эмулятором" был пример скролла. Так вот там использовался какой-то интересный шрифт. Как это получилось?
    Кстати предложенная вами связка "спектакулятор+кримсон+асам" очень понравилась, довольно удобно.

  9. #6
    Guru
    Регистрация
    25.01.2005
    Адрес
    Miass, Chelyabinsk region
    Сообщений
    4,083
    Благодарностей: 924
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от helcril Посмотреть сообщение
    что такое "$+4"?
    $ - значит адрес текущей инструкции, т.е.

    label:
    jr nc,$+4 ;2 байта
    set 7,(hl) ;2 байта
    label2:

    это означает, что если CY сброшен, то пропустить set 7,(hl).
    т.е. $ будет равен label, а $+4=label2.

    например, jr $ зациклит программу.

  10. Этот пользователь поблагодарил psb за это полезное сообщение:
    helcril (17.12.2009)

  11. #7
    Master Аватар для GM BIT
    Регистрация
    27.11.2008
    Адрес
    Красноярск
    Сообщений
    747
    Благодарностей: 230
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от helcril Посмотреть сообщение
    Так вот там использовался какой-то интересный шрифт. Как это получилось?
    Там взят стандартный шрифт из ПЗУ смещен на один пиксель и наложенный на него же:

    not_end ld l,a
    ld h,0
    add hl,hl
    add hl,hl
    add hl,hl
    ld de,#3c00
    add hl,de ;находим символ в ПЗУ
    ld de,buff
    ld b,8 ;цикл перебрасывает 8 байт символа из ПЗУ в buff
    loop2 ld a,(hl) ;берем байт из ПЗУ !!!!!!!!!!!!!!!!!!!!!!
    rrca ;сдвигаем вправо на один пиксель !!!!!!!!!!!!!!!!!!!!!!!!!!!!
    or (hl) ;совмещаем наложением сдвинутый и нет !!!!!!!!!!!!!!!!!!!!!!!!!!!!
    ld (de),a ;кладем получившийся результат !!!!!!!!!!!!!!!!!
    inc l
    inc de
    djnz loop2
    ret

  12. Этот пользователь поблагодарил GM BIT за это полезное сообщение:
    helcril (17.12.2009)

  13. #8
    Member Аватар для helcril
    Регистрация
    15.12.2009
    Адрес
    Angarsk
    Сообщений
    148
    Благодарностей: 50
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Спасибо всем за помощь!
    А вообще, может посоветуете какие-нибудь книжки (кроме уже упомянутой мной "Как написать игру на Ассемблере") по Ассемблеру Z-80 для начинающих? Интересует именно "развлекательная" тематика, т.е. какие-нибудь подобные "скроллеры", примитивные демки, игрушки...

  14. #9
    Guru Аватар для jerri
    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    3,363
    Благодарностей: 706
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    нууу почитай ZX Ревю и всякое здесь
    С уважением,
    Jerri / Red Triangle.
    [02.05.2014] не забудь этот день. Чубайс должен умереть. Dixi.
    [l'Abbey des morts TSEvo EV...5%] kiwi кошелек +79178162712

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

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

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

Похожие темы

  1. Программный вертикальный скролл
    от x-code в разделе Вектор
    Ответов: 39
    Последнее: 05.10.2015, 09:59
  2. Процедуры на асме (умножение деления)
    от gres8 в разделе Программирование
    Ответов: 3
    Последнее: 25.01.2007, 10:26
  3. Ответов: 0
    Последнее: 18.08.2006, 20:40

Ваши права

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