User Tag List

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

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

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

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

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

    По умолчанию

    Цитата Сообщение от Dart Alver Посмотреть сообщение
    а потом просто смещение добавлять.
    но оно не константное жи. А обратно пропорционально ширине пикчи.

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

    хотя да. Наверное быстрее вычислить значение вначале

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

    Наверное так.

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

    Цитата Сообщение от Dart Alver Посмотреть сообщение
    Замени OR #F2 на ADD #F2 чтоб прокатило ))
    Таки да. Помогло. Благодарю.

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

  3. #2

    Регистрация
    10.01.2010
    Адрес
    Смоленская обл.
    Сообщений
    559
    Спасибо Благодарностей отдано 
    189
    Спасибо Благодарностей получено 
    200
    Поблагодарили
    101 сообщений
    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)

  4. #3

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

    По умолчанию

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

  5. #4

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

    По умолчанию

    Цитата Сообщение от Dart Alver Посмотреть сообщение
    Как-то так. Это пример конечно, можно и ещё поколдовать )) Да я и обшибиться мог, не проверял всё-таки ))
    И да - код что этот, что изначальный предполагает что спрайт атрибутов целиком помещается в экране,
    если вылезет - будет пичалька ))
    теперь несколько иная задача возникла.
    А именно разбить ldir на составные (т.к. планирую сделать зеркальную итерацию атрибутов в строке, и скип оных по ключевому цвету).
    Пробую так, но чёто не то. Какая-то кашыца получается в одну строку. Хотя казалось бы, что может пойти не так.

    Код:
                     push bc
                     LD    B,(_SPR_W)
    
    ALT_LDIR                ld a,(hl)
                                  ld (de),a
                                  inc hl
                                  INC DE
    
                                  DJNZ   ALT_LDIR
    
                    ; ldir

    Тут уже макс. скорость не требуется.
    Последний раз редактировалось ALKO; 02.10.2024 в 16:01.

  6. #5

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

    По умолчанию

    Цитата Сообщение от ALKO Посмотреть сообщение
    теперь несколько иная задача возникла.
    А именно разбить ldir на составные (т.к. планирую сделать зеркальную итерацию атрибутов в строке, и скип оных по ключевому цвету).
    Пробую так, но чёто не то. Какая-то кашыца получается в одну строку. Хотя казалось бы, что может пойти не так.
    LD B,(_SPR_W) - нет такой команды в Z80 !!!

    В остальном нифига не понял что ты хочешь сделать.

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

    ALKO(02.10.2024)

  7. #6

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

    По умолчанию

    Цитата Сообщение от Dart Alver Посмотреть сообщение
    LD B,(_SPR_W) - нет такой команды в Z80 !!!

    В остальном нифига не понял что ты хочешь сделать.
    Да... опять на те же грабли...
    Странно что компилятор не ругается и сглатует за милую душу эту ересь.

    Вопрос снят. Терь всё ок.

  8. #7

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

    По умолчанию

    Казалось, что всё уже, баZа для движка имеется. Ан нет. Всё никак не отстану.
    Вот в том блоке, где мы прибавляем смещение к hl, как мне выполнить проверку, что атрибуты находятся в диапазоне от 0 до 31 ? Чтоб отсекало, а не лезло на след. строку.

    Цитата Сообщение от Dart Alver Посмотреть сообщение
    сначала найдём адрес в буфере (почти та же процедура) ))

    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
    Как-то так. Это пример конечно, можно и ещё поколдовать )) Да я и обшибиться мог, не проверял всё-таки ))
    И да - код что этот, что изначальный предполагает что спрайт атрибутов целиком помещается в экране,
    если вылезет - будет пичалька ))
    - - - Добавлено - - -

    Прост не хотелось бы переделывать ширину буфера.

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

    Цитата Сообщение от ALKO Посмотреть сообщение
    Прост не хотелось бы переделывать ширину буфера.
    но, видимо, таки придётся...

  9. #8

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

    По умолчанию

    Стал переделывать шырину буфера (на 40 байт на строку вместо 32-ух)
    Заменил в этой строке на ld a,40
    Цитата Сообщение от ALKO Посмотреть сообщение
    ld a,32 ; ну а вот и наше смещение
    sub c ; теперь в A - смещение для строки

    1 ; всё начинаем цикл
    Затем процедура переброски буфера на экран:

    Код:
    VIRT_WIDE_ATTR_TO_SCR 
    	halt
    	di
        ld de,REAL_SCREEN
        ld hl,MAIN_BUFF ; главный буфер
    ;    ldir
    	LD    B,24
    WIDE_LOOP
    	push bc
        ld bc,32
    	ldir
    	ld bc,8 ; 40 ширина буфера минус 32 область реального экрана - остаток
    	add hl,bc 
    	pop bc
    	DJNZ  WIDE_LOOP 
    	ei
    RET
    Но почему-то позиция XY атрибутов начинается с косяком. То, что должно быть 0 по X, равняется 32-8.
    И вместо отсечения - переход на следующую строку...

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

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

  10. #9

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

    По умолчанию

    Цитата Сообщение от ALKO Посмотреть сообщение
    Стал переделывать шырину буфера (на 40 байт на строку вместо 32-ух)
    Заменил в этой строке на ld a,40
    И это всё что ты заменил ? А то, что старом варианте проги адресация была гвоздями прибита к ширине 32 байта ты учёл ? ))

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

    Вот очень простенький и медленный вариант адресации для 40 байтной ширины буфера.

    Код:
    ; адрес в буфере шириной 40 байт  E-x , D-y
    ; 40 не кратен степеням 2-ки
    
                    ; ADR= Y*40+X = Y*32+Y*8+X
                    ; максимальный Y=23 ; 256/23=11,13...
                    ; в нашем случае можно умножение на 8 использовать байтовое
                    ; а уже дальше придётся переходить на слова
                    
                     push hl
                     ld a,d ; Y
                     ld d,#F2  ; старший байт буфера
                     add a,a ; *2
                     add a,a ; *4
                     add a,a ; *8
                     ld l,a
                     ld h,0
                     add hl,hl ; *16
                     add hl,hl ; *32
                     add a,l    ; \ 
                     ld l,a     ; |  *32 + *8
                    jp nc,1F    ; |
                     inc h      ; /
    1                add hl,de  ; +x +буфер
                     ex de,hl
                     pop hl
    Пытаться оптимизировать дальше влом. ))
    Если бы ширина буфера была бы скажем 64 или 128 (кратна степеням 2-ки), то арифметика адресации была бы попроще. ))

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

    ALKO(06.10.2024)

  11. #10

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

    По умолчанию

    Цитата Сообщение от Dart Alver Посмотреть сообщение
    Если бы ширина буфера была бы скажем 64 или 128 (кратна степеням 2-ки), то арифметика адресации была бы попроще. ))
    Шота оно не пашет у меня...
    делать шырину 64... жертвовать впустую 576 байт... не уверен что могу сейчас себе это позволить.

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

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

Эту тему просматривают: 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

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

Ваши права

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