User Tag List

Страница 41 из 51 ПерваяПервая ... 373839404142434445 ... ПоследняяПоследняя
Показано с 401 по 410 из 501

Тема: Тема для всяких глупых вопросов

  1. #401

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

    По умолчанию

    Цитата Сообщение от ALKO Посмотреть сообщение
    хотя да. Наверное быстрее вычислить значение вначале

    LD HL, offset
    LD B, (_SPR_W)
    LD A, 32
    SUB B
    LD (HL), A

    Наверное так.
    Хмм... Нет такой команды 'LD B, (**)', есть 'LD A,(**)' или 'LD BC,(**)'
    И много лишнего, например HL зря приплёл.

    можно:

    Код:
    LD A,(_SPR_W)
    LD B,A
    LD A,32
    SUB B
    LD (offset),A
    но лучше например

    Код:
    LD A,(_SPR_W)
    NEG            ; A=-A
    ADD A,32
    LD (offset),A

    Оба варианта одинаковы и по тактам и по размеру, но во втором случае портится только регистр A

    А можно сохранять позицию перед LDIR.

    Например вот вариант изменения твоего кода для примера.

    Код:
       ld hl, SPR_ATTR  ;указатель на массив DEFB
    
    ; Для начала если расположение ячеек координат и размера идёт друг за другом
    ; типо так :  
    ;_SPR_X  DB ?
    ;_SPR_Y  DB ?
    ;_SPR_W  DB ?
    ;_SPR_H  DB ?
    ;  то можно вместо конструкции
      
           ;         ld a,(_SPR_Y)
           ;         ld d,a
           ;         ld a,(_SPR_X)
           ;         ld e,a
           ;         ld a,(_SPR_H)
           ;         ld b,a
         
    ; поступить проще
    
                    ld de,(_SPR_X)  ; E=(_SPR_X) , D=(_SPR_Y)
                    ld bc,(_SPR_W)  ; C=(_SPR_W) , B=(_SPR_H)
                                                           
    ; а теперь вместо этого              
    
    ;PUTSPRITES2     push bc
           ;         push de
    
           ;         LD A,D
           ;         RRCA
           ;         RRCA
           ;         RRCA
           ;         LD C,A
           ;         AND 31
           ;         OR 242 ; 61952/256
           ;         LD B,A
           ;         LD A,C
           ;         AND 252
           ;         OR E
           ;         LD C,A
    
           ;         ld d,b
           ;         ld e,c
           ;         ld bc,(_SPR_W)
           ;         ld b,0
           ;         ldir
    
           ;         pop de
    
           ;         inc d
    
           ;         pop bc
           ;        djnz PUTSPRITES2
    
           ;    ret
    
    ; сначала найдём адрес в буфере (почти та же процедура) ))
    
                     ld a,d
                     rrca
                     rrca
                     rrca
                     ld d,a
                     and #E0
                     or e
                     ld e,a
                     ld a,d
                     and 3
                     add a,#F2  ; Для буфера в #F200
                     ld d,a     ; в DE - адрес, никаких BC портить не надо
                
                     ld a,32    ; ну а вот и наше смещение
                     sub c      ; теперь в A - смещение для строки
    
    1          ; всё начинаем цикл
                     push bc
                     ld b,0     
                     ldir
                     ld c,a         ; теперь bc - смещение
                     ex de,hl
                     add hl,bc      ; переход на новую строку
                     ex de,hl
                     pop bc            
                    djnz 1B
    
                  ret
    Как-то так. Это пример конечно, можно и ещё поколдовать )) Да я и обшибиться мог, не проверял всё-таки ))
    И да - код что этот, что изначальный предполагает что спрайт атрибутов целиком помещается в экране,
    если вылезет - будет пичалька ))

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

    ALKO(23.09.2024)

  2. #402

    Регистрация
    08.09.2005
    Адрес
    Воронеж
    Сообщений
    4,963
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    319
    Спасибо Благодарностей получено 
    312
    Поблагодарили
    236 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Dart Alver Посмотреть сообщение
    Как-то так. Это пример конечно, можно и ещё поколдовать ))
    push/pop и ldb в цикле нафиг не нужны, просто c загружать два раза (мб даже из половинок ix в сумме выгодней); счётчик строк в a
    Прихожу без разрешения, сею смерть и разрушение...

  3. #403

    Регистрация
    25.09.2009
    Адрес
    Одесса
    Сообщений
    2,311
    Спасибо Благодарностей отдано 
    96
    Спасибо Благодарностей получено 
    186
    Поблагодарили
    89 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Shiny Посмотреть сообщение
    ldir/lddr это верное решение, но стек все же лучше.
    Ну вот допустим есть у меня процедура переброски с виртуалки на реальный экран.
    Как её переделать под стековую?

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

    Ну или на худой конец может цепочкой ldi выгоднее?
    [свернуть]

    Код:
    VIRT_ATTR_TO_SCR 
        halt
        di
        ld bc,768
        ld de,REAL_SCREEN
        ld hl,MAIN_BUFF ; главный буфер
        ldir
    	ei
    RET
    Алсо, может есть альтернатива хальту, чтоб верт-синхру корректировала? Или тут только вручную считать такты, да NOP-ы фигачить?

  4. #404

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

    По умолчанию

    Цитата Сообщение от ALKO Посмотреть сообщение
    Ну вот допустим есть у меня процедура переброски с виртуалки на реальный экран.
    Как её переделать под стековую?

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

    Ну или на худой конец может цепочкой ldi выгоднее?
    [свернуть]

    Код:
    VIRT_ATTR_TO_SCR 
        halt
        di
        ld bc,768
        ld de,REAL_SCREEN
        ld hl,MAIN_BUFF ; главный буфер
        ldir
    	ei
    RET
    Алсо, может есть альтернатива хальту, чтоб верт-синхру корректировала? Или тут только вручную считать такты, да NOP-ы фигачить?
    тебе зачем через стек?
    С уважением,
    Jerri / Red Triangle.

  5. #405

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

    По умолчанию

    Цитата Сообщение от ALKO Посмотреть сообщение
    Ну или на худой конец может цепочкой ldi выгоднее?
    LDI быстрее чем LDIR, обычно по 32 байта перекидывают (компромисс между скоростью и объёмом кода).
    Heavy on the disasm
    Eric and the disasm
    Mask 3: Venom strikes disasm
    Bard's disasm

  6. #406

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

    По умолчанию

    Что лучше стек, ldir/lddr или ldi определяет поставленная задача.
    Необходимость и достаточность. Если достаточно скорости ldir , то усложнение кода будет избыточно, если недостаточно, то использование ldi или стека необходимо.
    По синхронизации. Halt наиболее простой и удобный способ. Если он по тем или иным причинам не устраивает, то можно например всунуть необходимую процедуру непосредственно в прерывание при im2. Если её нужно запускать только при определённых условиях - например поставить чтото типа семафор.

    Код:
    Flag EQU $+1 : ld a,1   ; сам флаг
                               or a      ; проверка на 0, если 0, то аыполняем
                              ret nz
                               inc a    ; сбрасываем 0 на 1
                               ld (Flag),a
                            ; дальше сама процедура
                            * * *

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

    ALKO(01.10.2024)

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

  8. #407

    Регистрация
    25.09.2009
    Адрес
    Одесса
    Сообщений
    2,311
    Спасибо Благодарностей отдано 
    96
    Спасибо Благодарностей получено 
    186
    Поблагодарили
    89 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Dart Alver Посмотреть сообщение
    Что лучше стек, ldir/lddr или ldi определяет поставленная задача.
    ну вот конкретно в данном случае стоит задача максимально быстро перебросить линейные 768 байт атрибутов.
    Чего-то я с циклом туплю снова. Почему-то цикл бесконечный получается.

    Код:
    VIRT_ATTR_TO_SCR
            halt
            di
        ;ld bc,768
        ld hl,MAIN_BUFF ; откуда
        ld de,REAL_SCREEN ; куда
    
       ; ldir
    
           ld  bc,48 ; вдвое больше, т.к. djnz и ldi декрементят B
    VTSL1
            dup 32 ; 32 ldi-шки подряд 
            ldi  
            edup
            djnz VTSL1
            ei
    RET

  9. #408

    Регистрация
    08.09.2005
    Адрес
    Воронеж
    Сообщений
    4,963
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    319
    Спасибо Благодарностей получено 
    312
    Поблагодарили
    236 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    Talking

    Цитата Сообщение от ALKO Посмотреть сообщение
    ну вот конкретно в данном случае стоит задача максимально быстро перебросить линейные 768 байт атрибутов.
    Чего-то я с циклом туплю снова. Почему-то цикл бесконечный получается.

    Код:
    VIRT_ATTR_TO_SCR
            halt
            di
        ;ld bc,768
        ld hl,MAIN_BUFF ; откуда
        ld de,REAL_SCREEN ; куда
    
       ; ldir
    
           ld  bc,48 ; вдвое больше, т.к. djnz и ldi декрементят B
    VTSL1
            dup 32 ; 32 ldi-шки подряд 
            ldi  
            edup
            djnz VTSL1
            ei
    RET
    КАЖДЫЙ ldi декрементит BC (а не b)
    Прихожу без разрешения, сею смерть и разрушение...

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

    ALKO(01.10.2024)

  10. #409

    Регистрация
    25.09.2009
    Адрес
    Одесса
    Сообщений
    2,311
    Спасибо Благодарностей отдано 
    96
    Спасибо Благодарностей получено 
    186
    Поблагодарили
    89 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Lethargeek Посмотреть сообщение
    КАЖДЫЙ ldi декрементит BC (а не b)
    А, да. Значит...
    ld bc, 7680

    Жырновато по проверке цыкла выходит. Да и ощутимого прироста скорости не видно.

  11. #410

    Регистрация
    13.05.2018
    Адрес
    г. Тамбов
    Сообщений
    817
    Спасибо Благодарностей отдано 
    345
    Спасибо Благодарностей получено 
    661
    Поблагодарили
    201 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Привет всём...
    Про стек, там примерно так...

    ld sp, ix
    pop hl, de, bc, af
    exx
    ex af, af'
    pop hl, de, bc, af

    Затем...

    ld sp, iy
    push af, bc, de, hl
    exx
    ex af, af'
    push af, bc, de, hl

    На 16 байт...
    И тд...

    Процедура такая пошла с игры - Starion...
    Можно код посмотреть и найти саму
    процедуру...
    Про такты - pop и push - 21 такт на 2 байта,
    ldi, ldi - 2 по 16 = 32 такта...

    Ещё есть такой вариант...

    ld sp,

    pop hl
    ld ( ), hl

    Повторить 16 раз...
    В таком варианте pop и ld ( ), hl -
    26 тактов на 2 байта...
    Последний раз редактировалось Stl75; 01.10.2024 в 15:24.

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

    ALKO(01.10.2024)

Страница 41 из 51 ПерваяПервая ... 373839404142434445 ... ПоследняяПоследняя

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

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

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

Похожие темы

  1. Ответов: 42
    Последнее: 05.05.2021, 17:01
  2. Общая тема для моих вопросов (ассемблер и zx spectrum)
    от moronizzz в разделе Для начинающих
    Ответов: 17
    Последнее: 23.08.2016, 18:13
  3. тема для мобильного....
    от rasmer в разделе Музыка
    Ответов: 0
    Последнее: 18.01.2008, 20:25

Метки этой темы

Ваши права

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