Сделал с примером отображения.
Теперь дело за малым: Сделать расчет разных амплитуд![]()
Сделал с примером отображения.
Теперь дело за малым: Сделать расчет разных амплитуд![]()
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
вертится на уме, что надо бы попробовать использовать изменения L и E, чтобы не ротировать зазря C=#44
...
что-то вроде:
ld b,.....
....
ld a,e
sub l
exx
rrca
rra
add a, SOME_NUMBER
ld c,a
?
Последний раз редактировалось char; 29.11.2013 в 22:46.
Спасибо, но не получается так.
Вот тоже, лёг спать, и мысль пришла заменить ld c,#44 и rlc c (4 байта) на ld a,l ... and 3 (3 байта) и условие соответственно изменить на NZ, но не получается. По фазе изменений не совпадает. Надо чтобы один раз в C было #EA, потом 4 раза #EB, 4 раза #EC и так далее. Вот это первое одиночное #EA весь ритм и сбивает.
---------- Post added at 04:21 ---------- Previous post was at 03:59 ----------
Спасибо за пример.
Как-то лениво делать варианты для кучи амплитуд, большинство из которых и не понадобятся. Это уже не творчество а ремесло какое-то.
Вот Char предлагал следующую амплитуду взять 63. А почему не 64? Байт позволяет.
Если кому-нибудь для конкретной программы понадобится конкретный вариант(и по амплитуде и по фазе), то это уже мотивация.
А пока что это этюд на рекорд. Кто будет планировать свою 128 байтную дему, тому будет ориентировка, сколько примерно займёт генератор таблицы синуса.![]()
ld a,e
exx
add hl,bc
and #03
jr nz,$+3
inc c
ex de,hl
?
пора глянуть весь листинг процедурки с окончательно посчитанными константами, в шестнадцатеричном виде, - что там получается...
Код:sintabgen2 ;; 42 байта (#2a байта :) ) ld de,#7fd0 ld hl,#0021 ld bc,#ffea exx ld hl,sintab+#40 ld d,h ld e,l loop ld a,e exx add hl,bc and #03 jr nz,$+3 inc c ex de,hl add hl,de ex de,hl ld a,d exx ld (hl),a ld (de),a inc e dec l jr nz,loop ld (hl),l loop2 xor a sbc a,(hl) ld (de),a inc l inc e jr nz,loop2
---------- Post added at 05:10 ---------- Previous post was at 05:02 ----------
Вариант в 41 байт:
Код:sintab EQU #7b00 ; или #7d00 .... ld e,l ld hl,sintab+#40 loop exx .... jr nz,loop-1![]()
Для разнообразия вот еще вам такой синус:
Не самый короткий алгоритм - 53 байта.Код:org $8000 LD B,201 ; Длина таблицы синуса LD HL,$8100 ; Адрес начала таблицы синуса EXX ; XOR A ; LD H,A ; LD L,A ; PUSH HL ; LD IXL,$FE ; JR LoopIn ; ;------------------------------- MLoop: EXX ; SBC HL,BC ; SBC A,IXL ; LD IXL,D ; ;------------------------------- LoopIn: LD D,A ; ADD A,A ; SBC A,A ; LD IXH,A ; LD A,D ; LD E,H ; LD B,3 ; RLoop: SRA D ; RR E ; DJNZ RLoop ; POP BC ; PUSH HL ; SBC HL,DE ; LD D,A ; SBC A,IXH ; ADD HL,HL ; ADC A,A ; EXX ; LD (HL),A ; INC L ; DJNZ MLoop ; POP AF ; RET ;
Да и есть некие ограничения. Длина получаемой таблицы... 201 байт)
Однако, есть и плюсы - высокая точность (теоретически, т.к. это не аппроксимация а чистый синус). В таблице можно сохранять не 8 бит, а все 16 (а то и 24, т.к. в алгоритме 24-битная арифметика).
Так же возможна любая амплитуда.
Можно было бы сделать таблицу 256 байт, но это усложнило бы алгоритм, и он бы стал громоздким.
Изначально думалось, что алгоритм будет компактнее, т.к. я уже привык к 32-битным ARM-ам, где подобный алгоритм получился бы не более, чем за 10 команд.
Кто первый догадается, что за алгоритм - тому конфетка)
Из бейсика вывел полученную таблицу, поделив результат на 2. Вроде все норм.
![]()
Последний раз редактировалось Titus; 30.11.2013 в 04:44.
Попробую угадать
complex Z=0+i*1
for i=0 to 200
Z=Z*(e^(i*PI/100))
SinTab[i]=Real(Z)
next
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)