;--------------------------------------------------------------------
; Описание: Модуль отображения анализатора
; Автор порта: Тарасов М.Н.(Mick),2011
;--------------------------------------------------------------------
;-------------------------------------------------------------------
; описание: Обновление параметров анализатора
; параметры: нет
; возвращаемое значение: нет
;---------------------------------------------------------------------
Analyzer_update:
ld hl,EAmplitude_ch0
ld a,(hl) ;+00h - Amplitude 0 right/left
and 0Fh
ld c,a
ld a,(hl) ;+00h - Amplitude 0 right/left
and 0F0h
rrca
rrca
rrca
rrca
cp c
jr nc,Analyzer_up_ch0
ld a,c
Analyzer_up_ch0:
ld (Analyzer_ch0_vol),a ;Amplitude 0
inc hl
ld a,(hl) ;+01h - Amplitude 1 right/left
and 0Fh
ld c,a
ld a, (hl) ;+01h - Amplitude 1 right/left
and 0F0h
rrca
rrca
rrca
rrca
cp c
jr nc,Analyzer_up_ch1
ld a,c
Analyzer_up_ch1:
ld (Analyzer_ch1_vol),a ;Amplitude 1
inc hl
ld a,(hl) ;+02h - Amplitude 2 right/left
and 0Fh
ld c,a
ld a,(hl) ;+02h - Amplitude 2 right/left
and 0F0h
rrca
rrca
rrca
rrca
cp c
jr nc,Analyzer_up_ch2
ld a,c
Analyzer_up_ch2:
ld (Analyzer_ch2_vol),a ;Amplitude 2
inc hl
ld a, (hl) ;+03h - Amplitude 3 right/left
and 0Fh
ld c,a
ld a, (hl) ;+03h - Amplitude 3 right/left
and 0F0h
rrca
rrca
rrca
rrca
cp c
jr nc,Analyzer_up_ch3
ld a,c
Analyzer_up_ch3:
ld (Analyzer_ch3_vol),a ;Amplitude 3
inc hl
ld a, (hl) ;+04h - Amplitude 4 right/left
and 0Fh
ld c,a
ld a, (hl)
and 0F0h
rrca
rrca
rrca
rrca
cp c
jr nc,Analyzer_up_ch4
ld a,c
Analyzer_up_ch4:
ld (Analyzer_ch4_vol),a ;Amplitude 4
inc hl
ld a, (hl) ;+05h - Amplitude 5 right/left
and 0Fh
ld c,a
ld a, (hl)
and 0F0h
rrca
rrca
rrca
rrca
cp c
jr nc,Analyzer_up_ch5
ld a,c
Analyzer_up_ch5:
ld (Analyzer_ch5_vol),a ;Amplitude 5
ret
;-------------------------------------------------------------------
; описание: Отрисовка левого канала анализатора
; параметры: HL - адрес экрана
; C - позиция в индикаторе
; возвращаемое значение: нет
;---------------------------------------------------------------------
Analyzer_draw_flash:
ld a,(Analyzer_ch0_vol)
ld e,a
ld a,(Analyzer_ch3_vol)
add e
and 0Fh
ld hl,Analyzer_table
ld e,a
ld d,0
add hl,de
ld a,(hl)
ld hl,5AFEh
ld (hl),a
inc l
ld (hl),a
ld a,(Analyzer_ch1_vol)
ld e,a
ld a,(Analyzer_ch4_vol)
add e
and 0Fh
ld hl,Analyzer_table
ld e,a
ld d,0
add hl,de
ld a,(hl)
ld hl,5AE4h
ld (hl),a
inc l
inc l
ld (hl),a
inc l
ld (hl),a
ld a,(Analyzer_ch2_vol)
ld e,a
ld a,(Analyzer_ch5_vol)
add e
and 0Fh
ld hl,Analyzer_table
ld e,a
ld d,0
add hl,de
ld a,(hl)
ld hl,5AEAh
ld (hl),a
inc l
ld (hl),a
inc l
ld (hl),a
inc l
ld (hl),a
inc l
ld (hl),a
inc l
ld (hl),a
inc l
ld (hl),a
inc l
ld (hl),a
inc l
ld (hl),a
inc l
ld (hl),a
inc l
ld (hl),a
inc l
ld (hl),a
ret
;-------------------------------------------------------------------
; описание: Обновление параметров анализатора
; параметры: нет
; возвращаемое значение: нет
;---------------------------------------------------------------------
Analyzer_init:
ld b, 6
ld hl,Analyzer_ch0_vol
Analyzer_init_loop:
ld (hl),0
inc hl
djnz Analyzer_init_loop
ret
;-------------------------------------------------------------------
; описание: Отображение анализатора
; параметры: нет
; возвращаемое значение: нет
;---------------------------------------------------------------------
Analyzer_view:
ld a,(Analyzer_ch0_vol)
ld e,a ;амплитуда
ld a,(Analyzer_ch1_vol)
cp e
jr c,Analyzer_max_level_0 ;вычисляем максимальное значение амплитуды
ld e,a
Analyzer_max_level_0:
ld d,0
ld c,d
ld a,(Analyzer_ch0_vol)
and a
jr z, Analyzer_skip_0
ld a,(EFrequency_ch0)
ld d,a ;тон
ld a,(EOctave_ch0)
and 3
ld c,a
Analyzer_skip_0:
ld a,(Analyzer_ch1_vol)
and a
jr z, Analyzer_skip_1
ld a,(EFrequency_ch0 + 1)
add d
ld d,a ;тон
ld a,(EOctave_ch0)
and 30h
rlca
rlca
rlca
rlca
add c
ld c,a
Analyzer_skip_1:
ld a,c ;итоговое значение октавы
add 0Fh
ld (loc_0_8D38+1),a
ld l,d ;итоговое значение тона
ld h,90h
ld a,e
add a,h
ld h,a ;вычислим ее таблице 8000...8FFFh
ld de,5007h
call Analyzer_draw
ld a,(Analyzer_ch2_vol)
ld e,a ;амплитуда
ld a,(Analyzer_ch3_vol)
cp e
jr c,Analyzer_max_level_1 ;вычисляем максимальное значение амплитуды
ld e,a
Analyzer_max_level_1:
ld d,0
ld c,d
ld a,(Analyzer_ch2_vol)
and a
jr z, Analyzer_skip_2
ld a,(EFrequency_ch2)
ld d,a ;тон
ld a,(EOctave_ch2)
and 3
ld c,a
Analyzer_skip_2:
ld a,(Analyzer_ch3_vol)
and a
jr z, Analyzer_skip_3
ld a,(EFrequency_ch2 + 1)
add d
ld d,a ;тон
ld a,(EOctave_ch2)
and 30h
rlca
rlca
rlca
rlca
add c
ld c,a
Analyzer_skip_3:
ld a,c ;итоговое значение октавы
add 0Fh
ld (loc_0_8D38+1),a
ld l,d ;итоговое значение тона
ld h,90h
ld a,e
add a,h
ld h,a ;вычислим ее таблице 8000...8FFFh
ld de,48ACh
call Analyzer_draw
ld a,(Analyzer_ch4_vol)
ld e,a ;амплитуда
ld a,(Analyzer_ch5_vol)
cp e
jr c,Analyzer_max_level_2 ;вычисляем максимальное значение амплитуды
ld e,a
Analyzer_max_level_2:
ld d,0
ld c,d
ld a,(Analyzer_ch4_vol)
and a
jr z, Analyzer_skip_5
ld a,(EFrequency_ch4)
ld d,a ;тон
ld a,(EOctave_ch4)
and 3
ld c,a
Analyzer_skip_5:
ld a,(Analyzer_ch5_vol)
and a
jr z, Analyzer_skip_6
ld a,(EFrequency_ch4 + 1)
add d
ld d,a ;тон
ld a,(EOctave_ch4)
and 30h
rlca
rlca
rlca
rlca
add c
ld c,a
Analyzer_skip_6:
ld a,c ;итоговое значение октавы
add 0Fh
ld (loc_0_8D38+1),a
ld l,d ;итоговое значение тона
ld h,90h
ld a,e
add a,h
ld h,a ;вычислим ее таблице 8000...8FFFh
ld de,4851h
Analyzer_draw:
ld b,31
loc_0_8D27:
xor a
ld ix,Analyzer_buffer
ld (ix + 0),a
ld (ix + 1),a
ld (ix + 2),a
ld (ix + 3),a
push de
push hl
ld l,(hl) ;получим смещение
ld h,0A0h ;для таблицы FC00h
ld e,(hl) ;смещение
ld d,0
add ix,de
inc h
ld a,(hl) ;байт
ld (ix + 0),a
pop hl
pop de
ld ix,Analyzer_buffer
ld a,(de)
and 0F0h
or (ix + 0)
ld (de),a
inc de
ld a,(ix + 1)
ld (de),a
inc de
ld a,(ix + 2)
ld (de),a
inc de
ld a,(de)
and 0Fh
or (ix + 3)
ld (de),a
dec de
dec de
dec de
inc d
ld a,d
and 7
jr nz,Analyzer_next_line
ld a,e
add 20h
ld e,a
jr c,Analyzer_next_line
ld a,d
sub 8
ld d,a
Analyzer_next_line:
ld a,l
loc_0_8D38:
add a,0 ;амплитуду увеличиваем
ld l,a
djnz loc_0_8D27
ret
;-------------------------------------------------------------------
; описание: Переменные правого и левого каналов анализатора
;---------------------------------------------------------------------
Analyzer_table:
db 47h,47h,47h,46h,46h,46h,45h,45h,45h,44h,44h,44h,43h,43h,42h,42h
;-------------------------------------------------------------------
; описание: Переменные правого и левого каналов анализатора
;---------------------------------------------------------------------
Analyzer_ch0_vol:
db 0
Analyzer_ch1_vol:
db 0
Analyzer_ch2_vol:
db 0
Analyzer_ch3_vol:
db 0
Analyzer_ch4_vol:
db 0
Analyzer_ch5_vol:
db 0
Analyzer_buffer:
db 0,0,0,0