User Tag List

Страница 8 из 9 ПерваяПервая ... 456789 ПоследняяПоследняя
Показано с 71 по 80 из 82

Тема: Вопрос по ассемблеру Z80

  1. #71

    Регистрация
    18.07.2021
    Адрес
    г. Хмельницкий, Украина
    Сообщений
    105
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    33
    Поблагодарили
    25 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Так ещё можно:
    Код:
            ld de, 1000       ; будем делать 1000 итераций
    	
    	ld b,e            ; подготовка регистров
    	dec de            ; подготовка регистров
    	inc d             ; подготовка регистров
    	ld hl,0           ; после выполнения цикла, в hl должно быть значение 1000
    Loop:
    	inc hl
     	djnz Loop
    	dec d
    	jp nz,Loop
    О, вот тебе и раз - опоздал. Ну и ладно.
    Последний раз редактировалось 0xDEAD; 01.08.2022 в 20:07.

    Эти 2 пользователя(ей) поблагодарили 0xDEAD за это полезное сообщение:

    Evgeny Muchkin(07.08.2022), Zidane(01.08.2022)

  2. #72

    Регистрация
    23.10.2012
    Адрес
    г. Красноярск
    Сообщений
    206
    Спасибо Благодарностей отдано 
    47
    Спасибо Благодарностей получено 
    63
    Поблагодарили
    29 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    В общем решил так:
    LD BC,nn ;количество итераций, 2 байта
    LD HL,nn ;число с которым выполняются операции
    LOOP
    LD A,n ;константа в регистр
    ; Код программы
    DEC BC
    LD A,B
    OR C
    JR NZ,LOOP
    Если использовать CP C, то выполняется почему то 253 итерации. И все. А вот с OR пошло как надо. Всем спасибо )

  3. #73

    Регистрация
    03.07.2021
    Адрес
    г. Кировск
    Сообщений
    922
    Спасибо Благодарностей отдано 
    87
    Спасибо Благодарностей получено 
    211
    Поблагодарили
    156 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А еще можно так =)) при условии, что итераций меньше 32768

    LD DE,NN
    ....
    DEC DE
    BIT 7,D
    JR Z,REPEAT

    значение флага будет равно значению бита, т.е. когда бит 7=0 (число>=0 но меньше 32768) - сработает переход по Z
    ну и счетчик надо заранее уменьшать на 1, поскольку при нулевом значении DE цикл все еще будет крутиться

    Цитата Сообщение от Zidane Посмотреть сообщение
    сли использовать CP C, то выполняется почему то 253 итерации

    да, нужно использовать именно OR - нулевой результат будет тогда, когда оба регистра равны нулю

    Эти 3 пользователя(ей) поблагодарили reddie за это полезное сообщение:

    Dart Alver(02.08.2022), Reobne(01.08.2022), Zidane(01.08.2022)

  4. #74

    Регистрация
    02.05.2015
    Адрес
    г. Таллин, Эстония
    Сообщений
    1,691
    Спасибо Благодарностей отдано 
    302
    Спасибо Благодарностей получено 
    223
    Поблагодарили
    159 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Zidane Посмотреть сообщение
    В общем решил так:

    LD BC,nn ;количество итераций, 2 байта
    LD HL,nn ;число с которым выполняются операции
    LOOP
    LD A,n ;константа в регистр
    ; Код программы
    DEC BC
    LD A,B
    OR C
    JR NZ,LOOP

    Если использовать CP C, то выполняется почему то 253 итерации. И все. А вот с OR пошло как надо. Всем спасибо )
    LD A,n не имеет смысла, т.к. чуть ниже идёт LD A,B

    Ну и попробуем сравнить:


    Код:
       ld bc, 1000
    loop:
       dec bc         ; 6t
       ld a,b           ; 4t
       or c             ; 4t
       jr nz, loop    ; 12t
                          ; итого 26 тактов
    или так

    Код:
       ld bc, 1000
    loop:
       djnz loop    ; 13/8t
       dec c           ; 4t
       jr nz, loop    ; 12/7t
                          ; итого 29 тактов (чуть меньше, т.к. последний виток быстрее переход)
    или так

    Код:
       ld bc, 1000
    loop:
       dec c           ; 4t
       jr nz, loop    ; 12/7t
       dec b           ; 4t
       jr nz, loop    ; 12/7t
                          ; итого 32 такта (чуть меньше, т.к. последний виток быстрее переход)
    и предложенное выше

    Код:
       ld de, 1000
    loop:
       dec de         ; 6t
       bit 7,d         ; 8t
       jr z, loop     ; 12t
                          ; итого 26 тактов

    Первый вариант быстрее, и чуть короче, но использует регистр А.
    Третий вариант медленнее второго, но зато не привязан к B, можно использовать два любых регистра.
    Четвёртый не привязан к А, но имеет ограничение на 32765 значений.
    Что лучше - выбирать нужно по конкретной задаче.
    Последний раз редактировалось Bedazzle; 02.08.2022 в 13:01.
    Heavy on the disasm
    Eric and the disasm
    Mask 3: Venom strikes disasm
    Bard's disasm

  5. #75

    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,101
    Спасибо Благодарностей отдано 
    1,335
    Спасибо Благодарностей получено 
    322
    Поблагодарили
    151 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Bedazzle Посмотреть сообщение
    Код:
       ld bc, 1000
    loop:
       djnz loop    ; 13/8t
       dec c           ; 4t
       jr nz, loop    ; 12/7t
                          ; итого 29 тактов (чуть меньше, т.к. последний виток быстрее переход)
    На самом деле 13+11/256. Потому что 255 из 256 раз djnz цикл заворачивает с затратой 13 тактов, и лишь один раз из 256 до jr дело доходит

    Цитата Сообщение от Bedazzle Посмотреть сообщение
    Код:
    ld bc, 1000
    loop:
       dec c           ; 4t
       jr nz, loop    ; 12/7t
       dec b           ; 4t
       jr nz, loop    ; 12/7t
                          ; итого 32 такта (чуть меньше, т.к. последний виток быстрее переход)
    Аналогично 16+11/256

  6. #76

    Регистрация
    02.05.2015
    Адрес
    г. Таллин, Эстония
    Сообщений
    1,691
    Спасибо Благодарностей отдано 
    302
    Спасибо Благодарностей получено 
    223
    Поблагодарили
    159 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Reobne Посмотреть сообщение
    На самом деле 13+11/256. Потому что 255 из 256 раз djnz цикл заворачивает с затратой 13 тактов, и лишь один раз из 256 до jr дело доходит

    Аналогично 16+11/256
    Это если мы знаем, что у нас 1000 циклов, а если будет 50 или 100, то получится иная раскладка.
    Heavy on the disasm
    Eric and the disasm
    Mask 3: Venom strikes disasm
    Bard's disasm

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

  8. #77

    Регистрация
    23.10.2012
    Адрес
    г. Красноярск
    Сообщений
    206
    Спасибо Благодарностей отдано 
    47
    Спасибо Благодарностей получено 
    63
    Поблагодарили
    29 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Код:
    LD A,n не имеет смысла, т.к. чуть ниже идёт LD A,B
    Очень даже имеет, так как в начале программы используется константа которая не меняется. Собственно в моей программе туда грузим вполне себе конкретный байт цветности, а потом выгружаем его в ячейку памяти. Вообще, поскольку константа не меняется, можно было бы её напрямую грузить в вычисляемую ячейку памяти, но программа была уже написана и работала, так что... )

    Но все равно благодарен всем присутствующим за помощь. Она потом используется. Возможно даже по назначению. Только OBS Надо настроить нормально, а то в последний раз кошмар что было. Но удалять уже жаль.
    Последний раз редактировалось Zidane; 02.08.2022 в 16:42.

  9. #78

    Регистрация
    10.01.2010
    Адрес
    Смоленская обл.
    Сообщений
    556
    Спасибо Благодарностей отдано 
    187
    Спасибо Благодарностей получено 
    197
    Поблагодарили
    100 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Bedazzle Посмотреть сообщение
    или так

    Код:

    Код:
       ld bc, 1000
    loop:
       djnz loop    ; 13/8t
       dec c           ; 4t
       jr nz, loop    ; 12/7t
                          ; итого 29 тактов (чуть меньше, т.к. последний виток быстрее переход)
    Пример немного с ошибкой по числу итераций - нужно LD CB,1000 [+256] а не LD BC,1000 .
    Ну а поскольку такой команды нет , то надо выкручиваться вручную или макросом )))
    И учитываем что если младьший байт числа итераций не 0 , то старший нужно увеличить на 1

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

    Reobne(02.08.2022)

  10. #79

    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,101
    Спасибо Благодарностей отдано 
    1,335
    Спасибо Благодарностей получено 
    322
    Поблагодарили
    151 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Bedazzle Посмотреть сообщение
    а если будет 50
    Ну да, я в среднем и приблизительно написал. Если мы знаем сколько конкретно циклов будет, то можем конкретно посчитать такты.
    Код:
       ld bc, 1000
    loop:
       djnz loop    ; 13/8t
       dec c           ; 4t
       jr nz, loop    ; 12/7t
                          ; итого 29 тактов (чуть меньше, т.к. последний виток быстрее переход)
    Например 50 циклов. Считаем. 49 раз djnz завернёт за 13 тактов. Плюс один раз djnz 8t, dec 4t и jr 7t.
    49*13+8+4+7=50*13-13+8+4+7=650+6=656
    За цикл будет 656/50=1312/100=13,12
    Всё равно 13 с мелочью. Но не 29.

  11. #80

    Регистрация
    02.05.2015
    Адрес
    г. Таллин, Эстония
    Сообщений
    1,691
    Спасибо Благодарностей отдано 
    302
    Спасибо Благодарностей получено 
    223
    Поблагодарили
    159 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Reobne Посмотреть сообщение
    Ну да, я в среднем и приблизительно написал. Если мы знаем сколько конкретно циклов будет, то можем конкретно посчитать такты.
    Согласен.
    Кстати, если заменить JR на JP, можно ещё ускорить.

    - - - Добавлено - - -

    Цитата Сообщение от Dart Alver Посмотреть сообщение
    Пример немного с ошибкой по числу итераций
    Да, правильно подмечено.
    Heavy on the disasm
    Eric and the disasm
    Mask 3: Venom strikes disasm
    Bard's disasm

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

    Reobne(02.08.2022)

Страница 8 из 9 ПерваяПервая ... 456789 ПоследняяПоследняя

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

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

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

Похожие темы

  1. Книга по ассемблеру Z80
    от Shwartz в разделе Пресса
    Ответов: 11
    Последнее: 06.07.2018, 14:29
  2. Книги по бейсику и Ассемблеру Z80
    от stepmotor в разделе Программирование
    Ответов: 3
    Последнее: 30.01.2018, 19:53
  3. вопрос по z80 stealh
    от scl^mc в разделе Эмуляторы
    Ответов: 11
    Последнее: 17.08.2007, 15:32
  4. ламерский вопрос о временных диаграммах шин Z80
    от boo_boo в разделе Несортированное железо
    Ответов: 3
    Последнее: 30.01.2006, 13:14

Ваши права

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