Хм, вот и разбираюсь сейчас, что делать. В данный момент программа работает следующим образом:
Байт-код. Интерпретатор байт-кода.
Типы данных:
1.
Общее количество байтов. Байт-код. Режим. Скорость. Блок данных-текст или графика.
2.
Количество байтов. Байт-код. Это пауза, стоп или конец таблицы.
Effects_Init:
ldi r16,HIGH(Table_Effects*2)
sts POINT_TABLE_EFFECTS_H,r16 ; Запись адреса начала таблицы эффектов.
ldi r16,LOW(Table_Effects*2)
sts POINT_TABLE_EFFECTS_L,r16 ; Запись адреса начала таблицы эффектов.
Effects_Clear_Display:
CLEAR_EFFECTS_BUFFFER
Set_State _EFFECTS,_EFFECTS_PROCESS_BYTE_COD
Effects_Process_Byte_Code:
lds ZH,POINT_TABLE_EFFECTS_H ; Считывание адреса таблицы эффектов
lds ZL,POINT_TABLE_EFFECTS_L ; в указатель адреса.
lpm r16,Z+
cp r16,RSER ; Проверка данных на завершение таблицы.
lpm r16,Z
cpc r16,RSER ; Проверка данных на завершение таблицы.
brne Effects_Process_Byte_Code_0
Set_State _EFFECTS,_EFFECTS_INIT
ret
Effects_Process_Byte_Code_0:
sbiw ZL,1
movw r17:r16,ZH:ZL ; Копирование значения указателя адреса таблицы эффектов.
lpm r18,Z+ ; Считывание младшего байта значения смещения на начало следующего блока.
add r16,r18 ; Прибавление младшего байта значения смещения к значению указателя.
sts DISPLACE_POINT_TABLE_L,r16 ; Запись результата.
lpm r18,Z+ ; Считывание старшего байта значения смещения на начало следующего блока.
adc r17,r18 ; Прибавление старшего байта значения смещения к значению указателя.
sts DISPLACE_POINT_TABLE_H,r17 ; Запись результата.
lpm r16,Z+ ; Считывание байт-кода.
sts POINT_TABLE_EFFECTS_H,ZH ; Сохранение указателя адреса таблицы эффектов.
sts POINT_TABLE_EFFECTS_L,ZL ; Сохранение указателя адреса таблицы эффектов.
ldiz (Table_Effects_Modes) ; Указатель на начало таблицы режимов работы.
addw Z,r16,RCLR ; Прибавление байт-кода к указателю адреса.
shiftlwz
lpm r17,Z+ ; Считывание старшего байта адреса подпрограммы режима работы.
lpm r16,Z ; Считывание младшего байта адреса подпрограммы режима работы.
movw ZH:ZL,r17:r16 ; Копирование адреса в указатель.
ijmp
Effects_Shift_R_Init:
lds ZH,POINT_TABLE_EFFECTS_H ; Считывание адреса таблицы эффектов
lds ZL,POINT_TABLE_EFFECTS_L ; в указатель адреса.
ldix (ST_CNT_QUEUE+(ST_EFFECTS_SPEED*(ST_SIZE+1)))
ldi r16,1<<ST_BLOCK_FLG
st X+,r16
lpm r16,Z+ ; Считывание и
st X+,r16 ; запись младшего байта значения задержки.
sts EFFECTS_SPEED_L,r16
lpm r16,Z+ ; Считывание и
st X+,r16 ; запись старшего байта значения задержки.
sts EFFECTS_SPEED_H,r16
Effects_Read_Data LEFT_BUFFER ; Различие здесь, но это под вопросом, я еще пробую работать с графикой.
rcall UnPack_Effects_Data
sts POINT_TABLE_EFFECTS_H,ZH
sts POINT_TABLE_EFFECTS_L,ZL
Set_State _EFFECTS,_EFFECTS_SHIFT_R
Effects_Shift_R:
Check_S_Time_Out ST_EFFECTS_SPEED
sbrs r16,ST_TIME_OUT_FLG
ret
ldix (ST_CNT_QUEUE+(ST_EFFECTS_SPEED*(ST_SIZE+1)))
ldi r16,1<<ST_BLOCK_FLG
st X+,r16
lds r16,EFFECTS_SPEED_L
st X+,r16
lds r16,EFFECTS_SPEED_H
st X+,r16
ldix LEFT_BUFFER
ldiy EFFECTS_BUFFER
ldi r18,8 ; Счетчик байтов.
lds r19,CNT_SHIFTS
Effects_Shift_R_Cycle:
ld r16,X
ld r17,Y
lsr r16 ; В подпрограмме сдвига влево
ror r17 ; соответственно lsl и rol
st X+,r16
st Y+,r17
dec r18
brne Effects_Shift_R_Cycle
inc r19
cpi r19,16
brlo Save_CNT_SHIFTS_R
Set_State _EFFECTS,_EFFECTS_CLEAR_DISPLAY
sts CNT_SHIFTS,RCLR
ret
Save_CNT_SHIFTS_R:
sts CNT_SHIFTS,r19
rcall UnPack_Effects_Data
ret
Table_Effects:
;-------------------------------------------------------------------------
;-------------------------------------------------------------------------
.db tab_l(14)
.db _ET_SHIFT_LEFT, _DIR_LEFT
.db tab_l(150)
.db 0b00001110, 0b00010010
.db 0b00100010, 0b00100010
.db 0b00111110, 0b00100010
.db 0b00100010, 0b01000010
.db tab_l(14)
.db _ET_SHIFT_RIGHT, _DIR_RIGHT
.db tab_l(150)
.db 0b00001110, 0b00010010
.db 0b00100010, 0b00100010
.db 0b00111110, 0b00100010
.db 0b00100010, 0b01000010
;-------------------------------------------------------------------------