Что-то не выходит каменный цветок. Приведенные примеры компилируются в код вычисления. Сразу хочу сказать, не нужно выказывать свое раздражение. Сейчас в данный момент, на данном этапе мне нужно понять как создавать макросы, функции по аналогии с ассемблером. Пусть сейчас это будет на примере очистки определенного участка буфера дисплея.
На асме в легкую:
.macro goto_xy
ldi r16, (@0-1)*(@1-1)
.endmacro
goto_xy 2, 4
//========================================================================
.macro Clear_String // Очистка строки буфера дисплея с заданным начальным адресом и количеством очищаемых символов.
ldx DSP_BUF+(MAX_CHARS*(@0-1))+@1
ldi r17,@2
rcall _Clear_String
.endmacro
_Clear_String:
ldi r16,0x20
_Clear_String_Cycle:
st X+,r16
dec r17
brne _Clear_String_Cycle
ret
//------------------------------------------------------------------------
//------------------------------------------------------------------------
Clear_String_1: // Очистка строки буфера дисплея.
Clear_String 1, 0, MAX_CHARS
ret
Clear_String_2: // Очистка строки буфера дисплея.
Clear_String 2, 0, MAX_CHARS
ret
Clear_String_3: // Очистка строки буфера дисплея.
Clear_String 3, 0, MAX_CHARS
ret
Clear_String_4: // Очистка строки буфера дисплея.
Clear_String 4, 0, MAX_CHARS
ret
//========================================================================
Что хочу получить на си (пока это вычисляется функцией, а мне нужно, чтобы подобные задачи делались на этапе компиляции):
Пусть есть буфер дисплея. Определенном участок нужно заполнить пробелами. Я хочу, чтобы писалось, скажем:
// X Y Число символов самого длинного сообщения в данном участке.
// Чтобы затерлись короткие сообщения, разумеется.
clr_str 1, 7, N
А в функцию подставлялось MaxX*(y-1)+(x-1), то есть вычисленный еще на этапе компилирования адрес в буфере и N.