User Tag List

Страница 4 из 7 ПерваяПервая 1234567 ПоследняяПоследняя
Показано с 31 по 40 из 62

Тема: Если бы у Медноногова был БК ?..

  1. #31

    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,681
    Спасибо Благодарностей отдано 
    2,711
    Спасибо Благодарностей получено 
    170
    Поблагодарили
    130 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    У меня нет никакого желания общаться с господами, засравшими мою тему по игрушке для БК своими обширными простынями с облизываниями IAR, уже не говоря про то, что облизывать IAR было бы несколько более уместно в более тематических разделах. Как можно доказать что-то людям, которые не понимают разницу между мёртвым закрытым и живым открытым компилятором? "Поместите Minix в свободный доступ, и одна из моих главных претензий к ней отпадёт" (c) Линус Торвальдс

    И уже не говоря про то, что разрабатывать драйвер FAT для Z80 на Си это уродство. Моё мнение в этом не поменяется. Драйвер - критичная часть системы, он должен быть максимально компактным и работать максимально быстро. Идёте по шаткому пути била гейца, господа.

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

    У меня практический вопрос к кодерам БК. Я разработал процедуры горизонтального циклического скроллинга прямоугольного окна влево на 4 и 8 пикселей. Теперь нужно сделать на 1 пиксель, надо юзать два битовых сдвига. Подскажите, плз, как это сделать наиболее оптимально? Может есть готовые какие-то подпрограммы?

    Код:
    void _Laser2_XYtoScr (int dummy, int r2, int r3,
      int x, int y, int len, int hgt)
    { /* R0 - screen address */
      asm("\
            MOV   %4, R0  // y      \n\
            MOV   R0, R1            \n\
            ASL   R0                \n\
            ASL   R0                \n\
            ADD   R1, R0            \n\
            SWAB  R0      // * 640  \n\
            ROR   R0                \n\
            ADD   $041000, R0       \n\
            ADD   %3, R0            \n\
            ADD   %3, R0  // + 2*x  \n\
            MOVB  %5, R2  // len    \n\
            MOVB  %6, R3  // hgt    \n"
          ::"g"(dummy), "g"(r2), "g"(r3),
            "g"(x), "g"(y), "g"(len), "g"(hgt)
      );
    } // _Laser2_XYtoScr
    
    void Laser2_WL4V (int x, int y, int len, int hgt)
    {
      asm("\
            JSR   PC, __Laser2_XYtoScr  \n\
            ASL   R2         // 2*x     \n\
            MOV   R4, -(SP)             \n\
            MOV   R5, -(SP)             \n\
    OUTLN4: MOV   R0, R1                \n\
            MOV   R2, R4                \n\
            MOVB  @R1, R5               \n\
    OUTWR4: MOVB  1(R1), (R1)+          \n\
            SOB   R4, OUTWR4            \n\
            MOVB  R5, @R1               \n\
            ADD   $0100, R0             \n\
            SOB   R3, OUTLN4            \n\
            MOV   (SP)+, R5             \n\
            MOV   (SP)+, R4             \n"
          :::"r2", "r3"
      );
    } // Laser2_WL4V
    
    void Laser2_WL8V (int x, int y, int len, int hgt)
    {
      asm("\
            JSR   PC, __Laser2_XYtoScr  \n\
            MOV   R4, -(SP)             \n\
            MOV   R5, -(SP)             \n\
    OUTLN5: MOV   R0, R1                \n\
            MOV   R2, R4                \n\
            MOV   @R1, R5               \n\
    OUTWR5: MOV   2(R1), (R1)+          \n\
            SOB   R4, OUTWR5            \n\
            MOV   R5, @R1               \n\
            ADD   $0100, R0             \n\
            SOB   R3, OUTLN5            \n\
            MOV   (SP)+, R5             \n\
            MOV   (SP)+, R4             \n"
          :::"r2", "r3"
      );
    } // Laser2_WL8V

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

  3. #32

    Регистрация
    06.12.2017
    Адрес
    г. Москва
    Сообщений
    1,724
    Спасибо Благодарностей отдано 
    167
    Спасибо Благодарностей получено 
    406
    Поблагодарили
    257 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    Теперь нужно сделать на 1 пиксель, надо юзать два битовых сдвига. Подскажите, плз, как это сделать наиболее оптимально? Может есть готовые какие-то подпрограммы?
    Окно фиксированного размера или каждый раз разное? Универсальная процедура под любой размер окна будет тормознутей.
    manwe.pdp-11.ru

  4. #33

    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,681
    Спасибо Благодарностей отдано 
    2,711
    Спасибо Благодарностей получено 
    170
    Поблагодарили
    130 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Окно заданного шириной len размера. Ширина в словах или в байтах, как удобнее.
    Тут часть проблемы - перенос двух битов, его придётся делать через логические операции. Но если бы хотя бы не делать эту операцию для каждого байта/слова.
    Может крутить строку пикселей на 1 бит, но два раза подряд? Не будут нехарактерные цвета проскакивать? (что теоретически возможно)

  5. #34

    Регистрация
    20.01.2010
    Адрес
    г. Зеленоград
    Сообщений
    600
    Спасибо Благодарностей отдано 
    28
    Спасибо Благодарностей получено 
    231
    Поблагодарили
    123 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Откуда 640 взялось? У БК 512/256 пикселей ширина экрана. 64. (0100) байт.

    Да, если сдвигать по одному биту прямо в экранной памяти, то возможно мерцание при попадании под луч. Надо по два. Это можно без дополнительной памяти, регистров хватает.

  6. #35

    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,681
    Спасибо Благодарностей отдано 
    2,711
    Спасибо Благодарностей получено 
    170
    Поблагодарили
    130 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Sandro Посмотреть сообщение
    Откуда 640 взялось?
    y задаётся не в пикселях, а в "знакоместах" по типу Спековских, а высота "знакоместа" на Бэкашке - 10 точек, так что это просто 64*10.

    Непринципиальный момент, вычисление координат работает же)

    Регистров хватит для чего? А если в линии экрана, допустим, 20 слов (20*8 пикселей)?

  7. #36

    Регистрация
    06.12.2017
    Адрес
    г. Москва
    Сообщений
    1,724
    Спасибо Благодарностей отдано 
    167
    Спасибо Благодарностей получено 
    406
    Поблагодарили
    257 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    Может крутить строку пикселей на 1 бит, но два раза подряд? Не будут нехарактерные цвета проскакивать? (что теоретически возможно)
    Я так и сделал. Может, и проскакивают лишние цвета, но только в одной строке при попадании под луч. Надо смотреть на конкретной картинке. На рандомных точках незаметно. В крайнем случае, можно делать это в буфере, а потом копировать сдвинутый результат.

    Бинарник и исходник: scroll.zip

    Код:
    	W = 32.	; width in bytes
    	H = 28.	; height in rows
    	Addr = 60040-H*100-W/2
    
    
    	CALL DrawNoise
    
    1:	MOV #Addr,R0
    	CALL ScrollRight
    	MOV #Addr+4000,R0
    	CALL ScrollLeft
    	BR 1
    	HALT
    
    ; R0 - screen address
    ScrollRight:
    	PUSH R1
    	MOV #H,R1
    1:		CLC
    		.Repeat W/2		; scroll row
    		{
    			ROL (R0)+
    		}
    		ADC -W(R0)
    		SUB #W,R0
    		INC PC			; repeat twice
    		BR 1
    	ADD #100,R0			; next row
    	SOB R1,1
    	POP R1
    	RET
    
    ; R0 - screen address
    ScrollLeft:
    	PUSH R1
    	ADD #(H-1)*100,R0	; right low corner
    	MOV #H,R1
    1:		ADD #W,R0
    		CLC
    		.Repeat W/2		; scroll row
    		{
    			ROR -(R0)
    		}
    		BCC 2
    			BIS #100000,W-2(R0)
    2:		INC PC			; repeat twice
    		BR 1
    	SUB #100,R0			; next row
    	SOB R1,1
    	POP R1
    	RET
    
    DrawNoise:
    	MOV #Addr,R3
    	MOV #100000,R2
    	MOV #H,R1
    1:		MOV #W/2,R0
    2:			MOV (R2),4000(R3)
    			MOV (R2)+,(R3)+
    		SOB R0,2
    		ADD #100-W,R3
    	SOB R1,1
    	RET
    Последний раз редактировалось Manwe; 26.12.2021 в 15:20.
    manwe.pdp-11.ru

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

    nimdasys_inbox_ru(26.12.2021), Oleg N. Cher(26.12.2021)

  8. #37

    Регистрация
    20.01.2010
    Адрес
    г. Зеленоград
    Сообщений
    600
    Спасибо Благодарностей отдано 
    28
    Спасибо Благодарностей получено 
    231
    Поблагодарили
    123 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    Регистров хватит для чего? А если в линии экрана, допустим, 20 слов (20*8 пикселей)?
    Длина строки как раз не важна. Идея в том, что два бита сдвигами запихиваем в два регистра, а на следующем слове их опять тасуем обратно. Примерно так:

    Код:
    mov @r1, r0
    asr r4
    ror r0
    ror r4
    asr r5
    ror r0
    ror r5
    ; мы провернули r0 на два бита и держим их в r4/r5
    mov r0, (r1)+
    mov @r1, r0
    asl r4
    ror r0 ; запихали запасённый бит, и взяли новый в флаг C
    rol r5 ; сохранили C в r5 и выдали обратно сохранённый
    ror r0
    rol r4 ; почти та же петрушка со вторым битом
    mov r0, (r1)+
    ; теперь r4/r5 поменялись чётностью, надо писать код с переставленными регистрами ...
    Вот как-то так. Почти все команды -- регистровые, поэтому на БК это будет побыстрее, чем два (а то и три) раза память вращать да копировать.

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

    Oleg N. Cher(27.12.2021)

  9. #38

    Регистрация
    06.12.2017
    Адрес
    г. Москва
    Сообщений
    1,724
    Спасибо Благодарностей отдано 
    167
    Спасибо Благодарностей получено 
    406
    Поблагодарили
    257 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Sandro Посмотреть сообщение
    Длина строки как раз не важна. Идея в том, что два бита сдвигами запихиваем в два регистра, а на следующем слове их опять тасуем обратно.
    Почти все команды -- регистровые, поэтому на БК это будет побыстрее, чем два (а то и три) раза память вращать да копировать.
    А запили тест с теми же параметрами, что у меня. Сравним быстродействие. Что-то навскидку не кажется, что твой способ быстрей – слишком много обращений к памяти при чтении инструкций.
    manwe.pdp-11.ru

  10. #39

    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,681
    Спасибо Благодарностей отдано 
    2,711
    Спасибо Благодарностей получено 
    170
    Поблагодарили
    130 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Спасибо за помощь. Не надо соревноваться в скорости. Оба способа хороши, каждый на своём месте. Я, скорее всего, возьму способ Manwe, просто потому, что при разработке для БК10 надо очень сильно экономить.

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

    nimdasys_inbox_ru(27.12.2021)

  11. #40

    Регистрация
    06.12.2017
    Адрес
    г. Москва
    Сообщений
    1,724
    Спасибо Благодарностей отдано 
    167
    Спасибо Благодарностей получено 
    406
    Поблагодарили
    257 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    Спасибо за помощь. Не надо соревноваться в скорости. Оба способа хороши, каждый на своём месте. Я, скорее всего, возьму способ Manwe, просто потому, что при разработке для БК10 надо очень сильно экономить.
    Смотря что экономить. Вот этот код
    Код:
    .Repeat W/2	; scroll row
    {
    	ROL (R0)+
    }
    означает несколько инструкций ROL (R0)+ подряд. Столько, сколько ширина окна в словах.
    Так что это не самый короткий код. Хотя, думаю, у него хорошее соотношение размер/скорость.
    manwe.pdp-11.ru

Страница 4 из 7 ПерваяПервая 1234567 ПоследняяПоследняя

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

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

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

Похожие темы

  1. А был ли Garic?..
    от newart в разделе Разный софт
    Ответов: 1
    Последнее: 15.10.2016, 11:14
  2. Ответов: 3
    Последнее: 18.02.2008, 20:16
  3. ДР Медноногова
    от Slider в разделе Поздравления
    Ответов: 11
    Последнее: 14.05.2007, 01:22
  4. а был ли сс05?
    от elfh в разделе Демо
    Ответов: 92
    Последнее: 27.10.2005, 14:42

Ваши права

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