Код: Выделить всё
; заготовка для двенадцатиканального массива счетчиков в генерацией
; выходного сигнала
;----------
; variable definitions
;(таблица обьявленных имен)
;_____
;таблица обьявленных имен - пользовательские константы
;
.equ step_C = ; константа досчета ноты С 8372,0
.equ step_CD = ; константа досчета ноты C#/Db 8869,8
.equ step_D = ; константа досчета ноты D 9397,3
.equ step_DE = ; константа досчета ноты D#/Eb 9956,1
.equ step_E = ; константа досчета ноты E 10548,0
.equ step_F = ; константа досчета ноты F 11175
.equ step_FG = ; константа досчета ноты F#/Gb 11840
.equ step_G = ; константа досчета ноты G 12544
.equ step_GA = ; константа досчета ноты G#/Ab 13290
.equ step_A = ; константа досчета ноты A 14080
.equ step_AH = ; константа досчета ноты A#/Hb 14917
.equ step_H = ; константа досчета ноты H 15804
;_____
;таблица обьявленных имен - переназначение регистров РОН
;
; регистры R26-R31 заранее объявлены как X,Y и Z
; R31:R30=ZH:ZL (Z)
; R29:R28=YH:YL (Y)
; R27:R26=XH:XL (X)
;
.def BH = r25 ; регистр (полный)
.def BL = r24 ; регистр (полный)
.def outbuf_h = r23 ; регистр (полный)
.def outbuf_l = r22 ; регистр (полный)
; .def name = r21 ; регистр (полный)
; .def name = r20 ; регистр (полный)
; .def name = r19 ; регистр (полный)
; .def name = r18 ; регистр (полный)
; .def name = r17 ; регистр (полный)
; .def name = r16 ; регистр (полный)
; .def regn = r15 ; регистр (урезан)
; .def regn = r14 ; регистр (урезан)
; .def regn = r11 ; регистр (урезан)
; .def regn = r10 ; регистр (урезан)
; .def regn = r9 ; регистр (урезан)
; .def regn = r8 ; регистр (урезан)
; .def regn = r7 ; регистр (урезан)
; .def regn = r6 ; регистр (урезан)
; .def regn = r5 ; регистр (урезан)
; .def regn = r4 ; регистр (урезан)
; .def regn = r3 ; регистр (урезан)
; .def regn = r2 ; регистр (урезан)
; .def matr = r1 ; регистр (урезан) r1 по возможности не использовать!!!
; .def madr = r0 ; регистр (урезан) r0 по возможности не использовать!!!
;_____
;таблица обьявленных имен - секция флагов пользователя
;
.equ nota_grid_l = PORTB
.equ nota_grid_h = PORTD
.equ bit_C = 0 ; PORTB.0
.equ bit_CD = 1 ; PORTB.1
.equ bit_D = 2 ; PORTB.2
.equ bit_DE = 3 ; PORTB.3
.equ bit_E = 4 ; PORTB.4
.equ bit_F = 5 ; PORTB.5
.equ bit_FG = 6 ; PORTB.6
.equ bit_G = 7 ; PORTB.7
.equ bit_GA = 0 ; PORTD.0
.equ bit_A = 1 ; PORTD.1
.equ bit_AH = 2 ; PORTD.2
.equ bit_H = 3 ; PORTD.3
;_____
;таблица обьявленных имен - секция определенных данных (ОЗУ)
;
.dseg
nota_cnt_C: .byte 2 ; текущий счетчик ноты С
nota_cnt_CD: .byte 2 ; текущий счетчик ноты C#/Db
nota_cnt_D: .byte 2 ; текущий счетчик ноты D
nota_cnt_DE: .byte 2 ; текущий счетчик ноты D#/Eb
nota_cnt_E: .byte 2 ; текущий счетчик ноты E
nota_cnt_F: .byte 2 ; текущий счетчик ноты F
nota_cnt_FG: .byte 2 ; текущий счетчик ноты F#/Gb
nota_cnt_G: .byte 2 ; текущий счетчик ноты G
nota_cnt_GA: .byte 2 ; текущий счетчик ноты G#/Ab
nota_cnt_A: .byte 2 ; текущий счетчик ноты A
nota_cnt_AH: .byte 2 ; текущий счетчик ноты A#/Hb
nota_cnt_H: .byte 2 ; текущий счетчик ноты H
;----------
; hole: .byte 2 ; технологическая дырка
;----------
step_cnt_C: .byte 2 ; размещение константы досчета ноты С
step_cnt_CD: .byte 2 ; размещение константы досчета ноты C#/Db
step_cnt_D: .byte 2 ; размещение константы досчета ноты D
step_cnt_DE: .byte 2 ; размещение константы досчета ноты D#/Eb
step_cnt_E: .byte 2 ; размещение константы досчета ноты E
step_cnt_F: .byte 2 ; размещение константы досчета ноты F
step_cnt_FG: .byte 2 ; размещение константы досчета ноты F#/Gb
step_cnt_G: .byte 2 ; размещение константы досчета ноты G
step_cnt_GA: .byte 2 ; размещение константы досчета ноты G#/Ab
step_cnt_A: .byte 2 ; размещение константы досчета ноты A
step_cnt_AH: .byte 2 ; размещение константы досчета ноты A#/Hb
step_cnt_H: .byte 2 ; размещение константы досчета ноты H
;_____
;таблица обьявленных имен - секция определенных данных (EEPROM)
;
.eseg
;_____
;
;
;----------
;
;
; "mac_ext_disp.txt" ; файл описания макросов
;
.macro xchrr ; псевдокоманда "обмен регистра/акумулятора/ с регистром"
eor @0,@1 ; вызывается как xchrr rd,rs
eor @1,@0
eor @0,@1
.endmacro
;
.macro ldiw ; псевдокоманда "загрузка слова в регистровую пару /X,Y,Z/"
ldi @0l,low(@1) ; вызывается как ldwi rp,0xnnnn или ldwi rp,name (где name=0xnnnn, rp=x,y,z)
ldi @0h,high(@1)
.endmacro
;
.macro ldpm ; псевдокоманда загрузка РСФ как ячейки памяти в регистр
lds @0,(@1+0x20) ; вызывается как ldpm rd,NAME (где NAME - имя порта РСФ)
.endmacro
;
.macro stpm ; псевдокоманда загрузка регистра из РСФ как ячейки памяти
sts (@0+0x20),@1, ; вызывается как stpm NAME,rs (где NAME - имя порта РСФ)
.endmacro
;
.macro cplb ; инверсия содержимого указанного бита в указанном регистре
sbrs @0,@1 ; вызывается как cplb rd,name (где NAME - имя/номер бита)
sbr @0,(1<<@1) ; действительно только для R16-R31 !!!
sbrc @0,@1
cbr @0,(1<<@1)
.endmacro
;
;
;----------
;
; собственно блок обработки массива и вывода данных в порты вывода
;
gen_grid:
out nota_grid_l,outbuf_l
out nota_grid_l,outbuf_l ; вывод предыдущего состояния буфера сетки частот
ldiw x,nota_cnt_C
movw yl,xl ; указатели на начало массива счетчиков
ptn_C:
ld bl,y+
ld bh,y+ ; акумулятор загружен
sbiw bl,1 ; dec bh:bl
brbc SREG_Z,ptn_CD ; если текущий счетчик не исчерпан переход к обработке следующего
cplb outbuf_l,bit_C ;0
ldd bl,y+(11*2)
adiw yl,1
ld bh,y
st x+,bl
st x+,bh
movw yl,xl ; восстановление указателя после перезагрузки счетчика
ptn_CD:
movw xl,yl ; восстановление указателя для обеих случаев
ld bl,y+
ld bh,y+ ; акумулятор загружен
sbiw bl,1 ; dec bh:bl
brbc SREG_Z,ptn_D ; если текущий счетчик не исчерпан переход к обработке следующего
cplb outbuf_l,bit_CD ;1
ldd bl,y+(11*2)
adiw yl,1
ld bh,y
st x+,bl
st x+,bh
movw yl,xl ; восстановление указателя после перезагрузки счетчика
ptn_D:
movw xl,yl ; восстановление указателя для обеих случаев
ld bl,y+
ld bh,y+ ; акумулятор загружен
sbiw bl,1 ; dec bh:bl
brbc SREG_Z,ptn_DE ; если текущий счетчик не исчерпан переход к обработке следующего
cplb outbuf_l,bit_D ;2
ldd bl,y+(11*2)
adiw yl,1
ld bh,y
st x+,bl
st x+,bh
movw yl,xl ; восстановление указателя после перезагрузки счетчика
ptn_DE:
movw xl,yl ; восстановление указателя для обеих случаев
ld bl,y+
ld bh,y+ ; акумулятор загружен
sbiw bl,1 ; dec bh:bl
brbc SREG_Z,ptn_E ; если текущий счетчик не исчерпан переход к обработке следующего
cplb outbuf_l,bit_DE ;3
ldd bl,y+(11*2)
adiw yl,1
ld bh,y
st x+,bl
st x+,bh
movw yl,xl ; восстановление указателя после перезагрузки счетчика
ptn_E:
movw xl,yl ; восстановление указателя для обеих случаев
ld bl,y+
ld bh,y+ ; акумулятор загружен
sbiw bl,1 ; dec bh:bl
brbc SREG_Z,ptn_F ; если текущий счетчик не исчерпан переход к обработке следующего
cplb outbuf_l,bit_E ;4
ldd bl,y+(11*2)
adiw yl,1
ld bh,y
st x+,bl
st x+,bh
movw yl,xl ; восстановление указателя после перезагрузки счетчика
ptn_F:
movw xl,yl ; восстановление указателя для обеих случаев
ld bl,y+
ld bh,y+ ; акумулятор загружен
sbiw bl,1 ; dec bh:bl
brbc SREG_Z,ptn_FG ; если текущий счетчик не исчерпан переход к обработке следующего
cplb outbuf_l,bit_F ;5
ldd bl,y+(11*2)
adiw yl,1
ld bh,y
st x+,bl
st x+,bh
movw yl,xl ; восстановление указателя после перезагрузки счетчика
ptn_FG:
movw xl,yl ; восстановление указателя для обеих случаев
ld bl,y+
ld bh,y+ ; акумулятор загружен
sbiw bl,1 ; dec bh:bl
brbc SREG_Z,ptn_G ; если текущий счетчик не исчерпан переход к обработке следующего
cplb outbuf_l,bit_FG ;6
ldd bl,y+(11*2)
adiw yl,1
ld bh,y
st x+,bl
st x+,bh
movw yl,xl ; восстановление указателя после перезагрузки счетчика
ptn_G:
movw xl,yl ; восстановление указателя для обеих случаев
ld bl,y+
ld bh,y+ ; акумулятор загружен
sbiw bl,1 ; dec bh:bl
brbc SREG_Z,ptn_GA ; если текущий счетчик не исчерпан переход к обработке следующего
cplb outbuf_l,bit_G ;7
ldd bl,y+(11*2)
adiw yl,1
ld bh,y
st x+,bl
st x+,bh
movw yl,xl ; восстановление указателя после перезагрузки счетчика
ptn_GA:
movw xl,yl ; восстановление указателя для обеих случаев
ld bl,y+
ld bh,y+ ; акумулятор загружен
sbiw bl,1 ; dec bh:bl
brbc SREG_Z,ptn_A ; если текущий счетчик не исчерпан переход к обработке следующего
cplb outbuf_h,bit_GA ;0
ldd bl,y+(11*2)
adiw yl,1
ld bh,y
st x+,bl
st x+,bh
movw yl,xl ; восстановление указателя после перезагрузки счетчика
ptn_A:
movw xl,yl ; восстановление указателя для обеих случаев
ld bl,y+
ld bh,y+ ; акумулятор загружен
sbiw bl,1 ; dec bh:bl
brbc SREG_Z,ptn_AH ; если текущий счетчик не исчерпан переход к обработке следующего
cplb outbuf_h,bit_A ;1
ldd bl,y+(11*2)
adiw yl,1
ld bh,y
st x+,bl
st x+,bh
movw yl,xl ; восстановление указателя после перезагрузки счетчика
ptn_AH:
movw xl,yl ; восстановление указателя для обеих случаев
ld bl,y+
ld bh,y+ ; акумулятор загружен
sbiw bl,1 ; dec bh:bl
brbc SREG_Z,ptn_H ; если текущий счетчик не исчерпан переход к обработке следующего
cplb outbuf_h,bit_AH ;2
ldd bl,y+(11*2)
adiw yl,1
ld bh,y
st x+,bl
st x+,bh
movw yl,xl ; восстановление указателя после перезагрузки счетчика
ptn_H:
movw xl,yl ; восстановление указателя для обеих случаев
ld bl,y+
ld bh,y+ ; акумулятор загружен
sbiw bl,1 ; dec bh:bl
brbc SREG_Z,ptn_out ; если текущий счетчик не исчерпан переход к обработке следующего
cplb outbuf_h,bit_H ;3
ldd bl,y+(11*2)
adiw yl,1
ld bh,y
st x+,bl
st x+,bh
ptn_out:
ret ; reti восстановление указателя для обеих случаев не проводится
;
;----------
;