Сделал с примером отображения.
Теперь дело за малым: Сделать расчет разных амплитуд :v2_dizzy_coder:
Вид для печати
Сделал с примером отображения.
Теперь дело за малым: Сделать расчет разных амплитуд :v2_dizzy_coder:
вертится на уме, что надо бы попробовать использовать изменения L и E, чтобы не ротировать зазря C=#44
...
что-то вроде:
ld b,.....
....
ld a,e
sub l
exx
rrca
rra
add a, SOME_NUMBER
ld c,a
?
Спасибо, но не получается так.
Вот тоже, лёг спать, и мысль пришла заменить 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 байт:
:smile:Код: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. Вроде все норм.
http://s020.radikal.ru/i721/1311/9a/68acfd7b9c7c.png
Попробую угадать :)
complex Z=0+i*1
for i=0 to 200
Z=Z*(e^(i*PI/100))
SinTab[i]=Real(Z)
next