@.CHARSET CP1251

@ GNU AS
.syntax unified
.cpu cortex-m4
.thumb
.fpu fpv4-sp-d16

@.desc type=module
@ +-----------------------------------------------------------+
@ |             Модуль функций работы со строками             |
@ +-----------------------------------------------------------+
@ |                                                           |
@ | PChar_Len - Получение длины строки в символах             |
@ |             вход: R4 - адрес строки                       |
@ |             выход: R0 - длина                             |
@ |                                                           |
@ +-----------------------------------------------------------+
@ |                                                           |
@ | PChar_Array - Получение адреса строки в массиве по номеру |
@ |        вход: R0 - номер строки, R4 - адрес первой строки  |
@ |       выход: R4 - адрес строки                            |
@ |                                                           |
@ | массив  строк  это  строки с нулевым  терминатором идущие |
@ | подряд:                                                   |
@ | StringArray:                                              |
@ | .asciz "Строка 0"                                         |
@ | .asciz "Строка 1"                                         |
@ | .asciz "Строка 2"                                         |
@ | вызов PChar_Array:                                        |
@ | LDR R4, =StringArray                                      |
@ | MOV R0, 1                                                 |
@ | BL PChar_Array                                            |
@ | в R4 вернет указатель на "Строка 1"                       |
@ +-----------------------------------------------------------+
@.enddesc

@.desc name=PChar_Len type=proc
@ +-----------------------------------------------------------+
@ |                                                           |
@ | PChar_Len - Получение длины строки в символах             |
@ |             вход: R4 - адрес строки                       |
@ |             выход: R0 - длина                             |
@ |                                                           |
@ +-----------------------------------------------------------+
@.enddesc

.GLOBAL PChar_Len
PChar_Len:          PUSH       { R3, R4 }

                    MOV        R0, 0

PChar_Len_loop:
                    LDRB       R3, [ R4 ], 1    @  загружаем байт для печати

                    CMP        R3, 0    @ символ конца строки
                    BEQ        PChar_Len_exit

                    CMP        R3, 1    @ загрузка координат и режима печати
                    ITT        EQ
                    ADDEQ      R4, R4, 8
                    BEQ        PChar_Len_loop

                    CMP        R3, 2    @ загрузка координат без режима печати
                    ITT        EQ
                    ADDEQ      R4, R4, 4
                    BEQ        PChar_Len_loop

                    ADD        R0, R0, 1
                    B          PChar_Len_loop

PChar_Len_exit:     POP       { R3, R4 }

                    BX         LR


@.desc name=PChar_Array type=proc
@ +-----------------------------------------------------------+
@ |                                                           |
@ | PChar_Array - Получение адреса строки в массиве по номеру |
@ |        вход: R0 - номер строки, R4 - адрес первой строки  |
@ |       выход: R4 - адрес строки                            |
@ |                                                           |
@ +-----------------------------------------------------------+
@.enddesc

.global PChar_Array
PChar_Array:        PUSH       { R0, R1 }

                    CMP        R0, 0
                    BEQ        PChar_Array_Exit

PChar_Array_CharLoop:
                    @ пропускаем строку
                    LDRB       R1, [ R4 ], 1
                    CMP        R1, 0
                    BNE        PChar_Array_CharLoop

                    @ уменьшаем счетчик пропускаемых строк
                    SUBS       R0, R0, 1
                    BNE        PChar_Array_CharLoop
PChar_Array_Exit:
                    POP        { R0, R1 }
                    BX         LR


