User Tag List

Страница 70 из 113 ПерваяПервая ... 666768697071727374 ... ПоследняяПоследняя
Показано с 691 по 700 из 1128

Тема: ЭТЮДЫ

  1. #691

    Регистрация
    31.01.2007
    Адрес
    Москва
    Сообщений
    810
    Спасибо Благодарностей отдано 
    11
    Спасибо Благодарностей получено 
    77
    Поблагодарили
    59 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    В 99% игр, где управление пойти вверх вниз вправо влево без диагоналей, при одновременном нажатии 2 клавиш срабатывает та что опрашивается раньше, меня это часто напрягало если нужно изменить направление резко надо помнить толи надо нажать точно, толи отпустить в зависимости от того куда в данный момент движется игрок. Раз уж занялся 3dgm решил сделать по нормальному. Может кому еще понравится идея
    Код:
    checkKey
    			ld	a, (oldKey)
    			ld	b, a
    			ld	a, (joyKey)
    			ld	(oldKey), a
    			ld	c, a
    			xor	b
    			ld	b, a
    			ld	a, (realKey)
    			ret	z
    			and	b
    			jr	nz, .s1
    			ld	a, c
    			and	b
    			jr	nz, .s2
    .s1
    			ld	a, c
    .s2
    			ld	(realKey), a
    			ret
    joyKey		db	0
    oldKey		db	0
    realKey		db	0
    Последний раз редактировалось krt17; 29.09.2017 в 21:00.

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

  3. #692

    Регистрация
    14.01.2008
    Адрес
    Эстония, Таллинн
    Сообщений
    177
    Спасибо Благодарностей отдано 
    16
    Спасибо Благодарностей получено 
    24
    Поблагодарили
    14 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Шынни, из той же оперы что всякие LFSR или LSFR не помню как он там называется, свою функцию он выполняет, он прост и его можно даже "железно" реализовать на простейшей логике, ждать от него звёзд с небес в отношении "случайности" я бы не стал...
    Разрабатываю новый сетевой протокол
    Variable Length Advanced Data Sending Over Network
    Что он будет делать и зачем нужен не знаю, разработал пока только название.

  4. #693

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

    По умолчанию

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

    Код:
    RNDF           ld hl,RNDbuff   ; начальное заполнение буфера для RND ; адрес буфера кратен 256
                   ld c,0
    1              ld a,r
                   and #07
                   ld b,a
                   ld a,#35
    .seed   EQU $-1
    2              bit 0,a
                  jr z,3F
                   xor %01110000
    3              rrca
                  djnz 2B
                   ld (.seed),a
                   ld (hl),a
                   inc l
                   dec c
                  jr nz,1B
                   ret
    
    
    RND     ; метод Фибоначчи с запаздываниями , использую буфер на 256 байт вместо 98 для удобства.
                 push hl,de,bc
                 ld de,RNDbuff+256-97   ; 97 a
    .ia      EQU $-2
                 ld hl,RNDbuff+256-33   ; 33 b
    .ib      EQU $-2
                 ld bc,RNDbuff          ; 0 i
    .ii      EQU $-2
                 ld a,(de)
                 sub (hl)
                 ld (bc),a           ; X[i]= X[i-a]-X[i-b]
                 inc l
                 inc c
                 inc e
                 ld (.ia),de
                 ld (.ib),hl
                 ld (.ii),bc
                 pop bc,de,hl
                 ret

  5. #694

    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    192
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    14 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Dart Alver, если уж делать большой буфер, то есть парочка вариантов поинтереснее:
    Код:
    rnd:	jp x0		
    
    x0:
    	ld a,x1	
    	ld (rnd+1),a	
    	ld a,(x1_n+1)
    x0_n:	sub a,n
    	ld (x2_n+1),a
    	ret		
    ....
    xn:
    	ld a,x1	
    	ld (rnd+1),a	
    	ld a,(x0_n+1)
    xn_n:	sub a,n
    	ld (x1_n+1),a
    	ret		
    
    
    rnd:
    	push hl
    p0:	ld hl,ptr
    	inc l
    ;	jr z, patch1
    	mov a,l	
    	ld (p0+1),a
    	add a,ofs1	
    ;	jr z,patch2
    	ld (p1+1),a
    	ld a,(hl)	
    p1:	ld l,n
    	sub a,(hl)
    	ld (hl),a
    	pop hl	
    	ret
    Первый вариант тратит 14 тактов на jp/ret, 20 тактов на правку команды jp, и 33 такта на вычисления. На генерацию одного байта тратится 67 тактов, недостаток только в том, что каждый элемент массива заменён кодом размером 14 байт.
    Второй вариант хорошо работает, если сделать 256 элементов в буфере, чтобы записывать новый элемент на место одного из старых, тогда вычисления займут 104 такта. Если нужен буфер конкретного размера, то можно либо добавить условные переходы на подпрограммы, которые будут править указатели и менять ofs1 на ofs2 и обратно при достижении указателями конца буфера, либо добавить только один из них, а подпрограммы чуть усложнить, чтобы они убирали первый условный переход и вставляли второй и наоборот, тогда вместо 14 дополнительных тактов при буфере на 98 элементов в среднем мы будем терять 10.

  6. #695

    Регистрация
    19.01.2017
    Адрес
    г. Арзамас
    Сообщений
    2,450
    Записей в дневнике
    42
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    162
    Поблагодарили
    119 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Куда уж поинтересней, jp/jr не быстрее?

  7. #696

    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    192
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    14 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Шынни Посмотреть сообщение
    Куда уж поинтересней, jp/jr не быстрее?
    Это меня малость переглючило, я забыл что для ret нужно не только код команды прочитать, но и два байта вытащить из стека, и считал что ret выполняется за 4 такта, поэтому в сумме у меня получилось 14 тактов вместо 20.

    Перебор генераторов вида x(n)=x(n-m)-x(n-1) позволил найти парочку весьма симпатичных:
    Первый получается при m=22, с длиной цикла 2^22-1, если в изначальном массиве не все числа чётные.
    Второй получается при m=37, с длиной цикла 2^37-2^19-2^18+1, если в изначальном массиве только одно нечётное число.
    Если забить на сохранение hl, для 8-разрядного генератора можно использовать вполне компактный код:
    Код:
    rnd8:	ld hl,buf-22
    	ld a,(hl)
    	inc l
    	jr z,rnd_2
    rnd_1:	sub a,(hl)
    	ld (hl),a
    	ld (rnd+1),hl
    	ret
    rnd_2:	ld l,-22
    	jp rnd_1
    Для 16-разрядного, при m=22, можно использовать вариант с 11 подпрограммами по 19 байт каждая + 3 байта на модифицируемую команду jp:
    Код:
    rnd16:	jp rnd_0
    
    rnd_0:	ld hl,nn
    	ld a,rnd_1
    	ld (rnd+1),a
    	ld a,(rnd_10+1)
    	sub a,l
    	ld l,a
    	sub a,h
    	ld h,a
    	ld (rnd_0+1),hl
    	ret
    ...

  8. #697

    Регистрация
    19.01.2017
    Адрес
    г. Арзамас
    Сообщений
    2,450
    Записей в дневнике
    42
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    162
    Поблагодарили
    119 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Замудреный код. окажись он по адресу $60FE и посыплется.

  9. #698

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

    По умолчанию

    Цитата Сообщение от blackmirror Посмотреть сообщение
    Код:
    rnd:
    	push hl
    p0:	ld hl,ptr
    	inc l
    ;	jr z, patch1
    	mov a,l	
    	ld (p0+1),a
    	add a,ofs1	
    ;	jr z,patch2
    	ld (p1+1),a
    	ld a,(hl)	
    p1:	ld l,n
    	sub a,(hl)
    	ld (hl),a
    	pop hl	
    	ret
    Подставил в спрей с ofs1=-22, работает вродебы нормально, заполняет область целиком, прирост в скорости в моём случае не определяется вовсе, разве что экономия десятка байтов кода, хотя при буфере 256 b тоже не особо существенно но тем не менее ))
    По поводу вообще... Я скажем так в гсч вообще 0.0, поэтому брал готовую формулу из интернета X[i]=X[i-a]-X[i-b] с рекомендованными значениями a=97, b=33. У вас немного попроще X[i]=X[i-a]-X[i-1] и в принципе для моей цели она вполне подошла, так что респект. ))

    А тут что-то вы перемудрили - не работает ))

    Цитата Сообщение от blackmirror Посмотреть сообщение
    Код:
    rnd8:	ld hl,buf-22
    	ld a,(hl)
    	inc l
    	jr z,rnd_2
    rnd_1:	sub a,(hl)
    	ld (hl),a
    	ld (rnd+1),hl
    	ret
    rnd_2:	ld l,-22
    	jp rnd_1
    Не понял логику в " rnd_1: sub (hl) " , когда l<>0. А результат - зацикливается гдето на десятке точек.

  10. #699

    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    192
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    14 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Dart Alver Посмотреть сообщение
    А тут что-то вы перемудрили - не работает ))
    Смысл всех переходов в этом коде, чтобы перезагрузить указатель на текущий элемент, если он дошёл до конца буфера, а адрес конца буфера должен быть кратен 256 байтам. Можно inc заменить на dec, а -22 на +22, чтобы buf указывал на начало буфера, но тогда буфер нужно увеличить на 1 элемент, поскольку 0й не будет использоваться. А так код вычисляет x[n]=x[n-1]-x[n-22] и записывает на место x[n-22]. Минимум данные вместе с кодом займут 40-41 байт, если делать буфер 256 байт, то можно выкинуть условный переход и выиграть 7 тактов.

  11. #700

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

    По умолчанию

    ld (rnd8+1),hl

Страница 70 из 113 ПерваяПервая ... 666768697071727374 ... ПоследняяПоследняя

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

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

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

Похожие темы

  1. Этюды: как бы написать поизящнее.
    от AndTorp в разделе Программирование
    Ответов: 5
    Последнее: 17.03.2008, 00:43
  2. Ответов: 0
    Последнее: 18.08.2006, 22:40
  3. Этюды: печать шрифтом 5x5...
    от breeze в разделе Программирование
    Ответов: 12
    Последнее: 27.03.2005, 05:21

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

Ваши права

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