ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
28 ноября
249516 Топик полностью
mazur (22.04.2011 07:37 - 18:37, просмотров: 114) ответил MBedder на Если у меня получаются такие подпрограммы, то это значит, что я где-то недодумал. Обнаружил - дорабатываю до унифицированной единой подпрограммы, зачастую без дополнительных расходов, иногда ценой пары-тройки команд на унификацию
Хм, вот и разбираюсь сейчас, что делать. В данный момент программа работает следующим образом: Байт-код. Интерпретатор байт-кода. Типы данных: 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 ;-------------------------------------------------------------------------