# Карта памяти

## Разнообразный

Все значения имеют прямой порядок байтов, поэтому меньшая цифра хранится по меньшему адресу.

| Адрес  | Размер     | Описание                                                           |
|--------|-----------:|--------------------------------------------------------------------|
|  00000 |          1 | MEG-4 основная версия прошивки                                     |
|  00001 |          1 | MEG-4 минорная версия прошивки                                     |
|  00002 |          1 | MEG-4 патченая версия прошивки                                     |
|  00003 |          1 | счетчик производительности, неизрасходованное время в 1/1000 секунды |
|  00004 |          4 | количество тактов в 1/1000 секунды с момента включения питания     |
|  00008 |          8 | временная метка UTC Unix                                           |
|  00010 |          2 | текущий язык                                                       |

Счетчик производительности показывает время, не затраченное на момент создания последнего кадра.
Если оно равно нулю или отрицательному значению, это означает, насколько ваша функция loop()
превысила доступный временной интервал.

## Указатель

| Адрес  | Размер     | Описание                                                           |
|--------|-----------:|--------------------------------------------------------------------|
|  00012 |          2 | состояние кнопок-указателей (см. [getbtn] и [getclk])              |
|  00014 |          2 | индекс спрайта указателя                                           |
|  00016 |          2 | координата X указателя                                             |
|  00018 |          2 | координата Y указателя                                             |

Кнопки указателя следующие:

| Макрос  | Битмаска  | Описание                                                           |
|---------|----------:|--------------------------------------------------------------------|
| `BTN_L` |         1 | Левая кнопка мыши                                                  |
| `BTN_M` |         2 | Средняя кнопка мыши                                                |
| `BTN_R` |         4 | Правая кнопка мыши                                                 |
| `SCR_U` |         8 | Прокрутите вверх                                                   |
| `SCR_D` |        16 | Прокрутить вниз                                                    |
| `SCR_L` |        32 | Прокрутить влево                                                   |
| `SCR_R` |        64 | Прокрутите вправо                                                  |

Старшие биты индекса спрайта указателя используются для горячих точек: биты 13–15 горячей точки Y,
биты 10–12 горячей точки X, биты 0–9 спрайта. Есть несколько предопределенных встроенных курсоров:

| Макрос       | Значение  | Описание                                                      |
|--------------|----------:|---------------------------------------------------------------|
| `PTR_NORM`   |      03fb | Обычный (стрелка) указатель                                   |
| `PTR_TEXT`   |      03fc | Текстовый указатель                                           |
| `PTR_HAND`   |      0bfd | Связь указатель                                               |
| `PTR_ERR`    |      93fe | Ошибочный указатель                                           |
| `PTR_NONE`   |      ffff | Указатель скрыт                                               |

## Клавиатура

| Адрес  | Размер     | Описание                                                           |
|--------|-----------:|--------------------------------------------------------------------|
|  0001A |          1 | хвост очереди клавиатуры                                           |
|  0001B |          1 | глава очереди клавиатуры                                           |
|  0001C |         64 | клавиатурная очередь, 16 элементов по 4 байта каждый (см. [popkey]) |
|  0005C |         18 | состояние нажатых клавиш клавиатуры по сканкодам (см. [getkey])    |

Ключи, извлеченные из очереди, представлены в UTF-8. Некоторые недопустимые последовательности UTF-8
представляют собой специальные (непечатаемые) клавиши, например:

| КлючКод | Описание                                        |
|---------|-------------------------------------------------|
| `\x8`   | Символ 8, клавиша <kbd>←Backspace</kbd>         |
| `\x9`   | Символ 9, клавиша <kbd>Tab</kbd>                |
| `\n`    | Символ 10, клавиша <kbd>⏎Enter</kbd>            |
| `\x1b`  | Символ 27, клавиша <kbd>Esc</kbd>               |
| `Del`   | Клавиша <kbd>Del</kbd>                          |
| `Up`    | Клавиша стрелки курсора <kbd>▴</kbd>            |
| `Down`  | Клавиша стрелки курсора <kbd>▾</kbd>            |
| `Left`  | Клавиша стрелки курсора <kbd>◂</kbd>            |
| `Rght`  | Клавиша стрелки курсора <kbd>▸</kbd>            |
| `Cut`   | Клавиша Cut (или <kbd>Ctrl</kbd>+<kbd>X</kbd>)  |
| `Cpy`   | Клавиша Copy (или <kbd>Ctrl</kbd>+<kbd>C</kbd>) |
| `Pst`   | Клавиша Paste (или <kbd>Ctrl</kbd>+<kbd>V</kbd>) |

Сканкоды следующие:

| СканКод  | Адрес   | Битмаска | Макрос           |
|---------:|---------|--------:|-------------------|
|        0 |   0005C |       1 | `KEY_CHEAT`       |
|        1 |   0005C |       2 | `KEY_F1`          |
|        2 |   0005C |       4 | `KEY_F2`          |
|        3 |   0005C |       8 | `KEY_F3`          |
|        4 |   0005C |      16 | `KEY_F4`          |
|        5 |   0005C |      32 | `KEY_F5`          |
|        6 |   0005C |      64 | `KEY_F6`          |
|        7 |   0005C |     128 | `KEY_F7`          |
|        8 |   0005D |       1 | `KEY_F8`          |
|        9 |   0005D |       2 | `KEY_F9`          |
|       10 |   0005D |       4 | `KEY_F10`         |
|       11 |   0005D |       8 | `KEY_F11`         |
|       12 |   0005D |      16 | `KEY_F12`         |
|       13 |   0005D |      32 | `KEY_PRSCR`       |
|       14 |   0005D |      64 | `KEY_SCRLOCK`     |
|       15 |   0005D |     128 | `KEY_PAUSE`       |
|       16 |   0005E |       1 | `KEY_BACKQUOTE`   |
|       17 |   0005E |       2 | `KEY_1`           |
|       18 |   0005E |       4 | `KEY_2`           |
|       19 |   0005E |       8 | `KEY_3`           |
|       20 |   0005E |      16 | `KEY_4`           |
|       21 |   0005E |      32 | `KEY_5`           |
|       22 |   0005E |      64 | `KEY_6`           |
|       23 |   0005E |     128 | `KEY_7`           |
|       24 |   0005F |       1 | `KEY_8`           |
|       25 |   0005F |       2 | `KEY_9`           |
|       26 |   0005F |       4 | `KEY_0`           |
|       27 |   0005F |       8 | `KEY_MINUS`       |
|       28 |   0005F |      16 | `KEY_EQUAL`       |
|       29 |   0005F |      32 | `KEY_BACKSPACE`   |
|       30 |   0005F |      64 | `KEY_TAB`         |
|       31 |   0005F |     128 | `KEY_Q`           |
|       32 |   00060 |       1 | `KEY_W`           |
|       33 |   00060 |       2 | `KEY_E`           |
|       34 |   00060 |       4 | `KEY_R`           |
|       35 |   00060 |       8 | `KEY_T`           |
|       36 |   00060 |      16 | `KEY_Y`           |
|       37 |   00060 |      32 | `KEY_U`           |
|       38 |   00060 |      64 | `KEY_I`           |
|       39 |   00060 |     128 | `KEY_O`           |
|       40 |   00061 |       1 | `KEY_P`           |
|       41 |   00061 |       2 | `KEY_LBRACKET`    |
|       42 |   00061 |       4 | `KEY_RBRACKET`    |
|       43 |   00061 |       8 | `KEY_ENTER`       |
|       44 |   00061 |      16 | `KEY_CAPSLOCK`    |
|       45 |   00061 |      32 | `KEY_A`           |
|       46 |   00061 |      64 | `KEY_S`           |
|       47 |   00061 |     128 | `KEY_D`           |
|       48 |   00062 |       1 | `KEY_F`           |
|       49 |   00062 |       2 | `KEY_G`           |
|       50 |   00062 |       4 | `KEY_H`           |
|       51 |   00062 |       8 | `KEY_J`           |
|       52 |   00062 |      16 | `KEY_K`           |
|       53 |   00062 |      32 | `KEY_L`           |
|       54 |   00062 |      64 | `KEY_SEMICOLON`   |
|       55 |   00062 |     128 | `KEY_APOSTROPHE`  |
|       56 |   00063 |       1 | `KEY_BACKSLASH`   |
|       57 |   00063 |       2 | `KEY_LSHIFT`      |
|       58 |   00063 |       4 | `KEY_LESS`        |
|       59 |   00063 |       8 | `KEY_Z`           |
|       60 |   00063 |      16 | `KEY_X`           |
|       61 |   00063 |      32 | `KEY_C`           |
|       62 |   00063 |      64 | `KEY_V`           |
|       63 |   00063 |     128 | `KEY_B`           |
|       64 |   00064 |       1 | `KEY_N`           |
|       65 |   00064 |       2 | `KEY_M`           |
|       66 |   00064 |       4 | `KEY_COMMA`       |
|       67 |   00064 |       8 | `KEY_PERIOD`      |
|       68 |   00064 |      16 | `KEY_SLASH`       |
|       69 |   00064 |      32 | `KEY_RSHIFT`      |
|       70 |   00064 |      64 | `KEY_LCTRL`       |
|       71 |   00064 |     128 | `KEY_LSUPER`      |
|       72 |   00065 |       1 | `KEY_LALT`        |
|       73 |   00065 |       2 | `KEY_SPACE`       |
|       74 |   00065 |       4 | `KEY_RALT`        |
|       75 |   00065 |       8 | `KEY_RSUPER`      |
|       76 |   00065 |      16 | `KEY_MENU`        |
|       77 |   00065 |      32 | `KEY_RCTRL`       |
|       78 |   00065 |      64 | `KEY_INS`         |
|       79 |   00065 |     128 | `KEY_HOME`        |
|       80 |   00066 |       1 | `KEY_PGUP`        |
|       81 |   00066 |       2 | `KEY_DEL`         |
|       82 |   00066 |       4 | `KEY_END`         |
|       83 |   00066 |       8 | `KEY_PGDN`        |
|       84 |   00066 |      16 | `KEY_UP`          |
|       85 |   00066 |      32 | `KEY_LEFT`        |
|       86 |   00066 |      64 | `KEY_DOWN`        |
|       87 |   00066 |     128 | `KEY_RIGHT`       |
|       88 |   00067 |       1 | `KEY_NUMLOCK`     |
|       89 |   00067 |       2 | `KEY_KP_DIV`      |
|       90 |   00067 |       4 | `KEY_KP_MUL`      |
|       91 |   00067 |       8 | `KEY_KP_SUB`      |
|       92 |   00067 |      16 | `KEY_KP_7`        |
|       93 |   00067 |      32 | `KEY_KP_8`        |
|       94 |   00067 |      64 | `KEY_KP_9`        |
|       95 |   00067 |     128 | `KEY_KP_ADD`      |
|       96 |   00068 |       1 | `KEY_KP_4`        |
|       97 |   00068 |       2 | `KEY_KP_5`        |
|       98 |   00068 |       4 | `KEY_KP_6`        |
|       99 |   00068 |       8 | `KEY_KP_1`        |
|      100 |   00068 |      16 | `KEY_KP_2`        |
|      101 |   00068 |      32 | `KEY_KP_3`        |
|      102 |   00068 |      64 | `KEY_KP_ENTER`    |
|      103 |   00068 |     128 | `KEY_KP_0`        |
|      104 |   00069 |       1 | `KEY_KP_DEC`      |
|      105 |   00069 |       2 | `KEY_INT1`        |
|      106 |   00069 |       4 | `KEY_INT2`        |
|      107 |   00069 |       8 | `KEY_INT3`        |
|      108 |   00069 |      16 | `KEY_INT4`        |
|      109 |   00069 |      32 | `KEY_INT5`        |
|      110 |   00069 |      64 | `KEY_INT6`        |
|      111 |   00069 |     128 | `KEY_INT7`        |
|      112 |   0006A |       1 | `KEY_INT8`        |
|      113 |   0006A |       2 | `KEY_LNG1`        |
|      114 |   0006A |       4 | `KEY_LNG2`        |
|      115 |   0006A |       8 | `KEY_LNG3`        |
|      116 |   0006A |      16 | `KEY_LNG4`        |
|      117 |   0006A |      32 | `KEY_LNG5`        |
|      118 |   0006A |      64 | `KEY_LNG6`        |
|      119 |   0006A |     128 | `KEY_LNG7`        |
|      120 |   0006B |       1 | `KEY_LNG8`        |
|      121 |   0006B |       2 | `KEY_APP`         |
|      122 |   0006B |       4 | `KEY_POWER`       |
|      123 |   0006B |       8 | `KEY_KP_EQUAL`    |
|      124 |   0006B |      16 | `KEY_EXEC`        |
|      125 |   0006B |      32 | `KEY_HELP`        |
|      126 |   0006B |      64 | `KEY_SELECT`      |
|      127 |   0006B |     128 | `KEY_STOP`        |
|      128 |   0006C |       1 | `KEY_AGAIN`       |
|      129 |   0006C |       2 | `KEY_UNDO`        |
|      130 |   0006C |       4 | `KEY_CUT`         |
|      131 |   0006C |       8 | `KEY_COPY`        |
|      132 |   0006C |      16 | `KEY_PASTE`       |
|      133 |   0006C |      32 | `KEY_FIND`        |
|      134 |   0006C |      64 | `KEY_MUTE`        |
|      135 |   0006C |     128 | `KEY_VOLUP`       |
|      136 |   0006D |       1 | `KEY_VOLDN`       |


## Геймпад

| Адрес  | Размер     | Описание                                                           |
|--------|-----------:|--------------------------------------------------------------------|
|  0006E |          2 | Пороговое значение джойстика геймпада (по умолчанию 8000)          |
|  00070 |          8 | Основной геймпад — сопоставление скан-кодов клавиатуры (см. [Клавиатура]) |
|  00078 |          4 | Состояние нажатия кнопки 4 геймпадов (см. [getpad])                |

Кнопки геймпада следующие:

| Макрос  | Битмаска  | Описание                                                           |
|---------|----------:|--------------------------------------------------------------------|
| `BTN_L` |         1 | Кнопка `◁` или джойстик влево                                     |
| `BTN_U` |         2 | Кнопка `△` или джойстик вверх                                     |
| `BTN_R` |         4 | Кнопка `▷` или джойстик вправо                                    |
| `BTN_D` |         8 | Кнопка `▽` или джойстик вниз                                      |
| `BTN_A` |        16 | Кнопка `Ⓐ`                                                        |
| `BTN_B` |        32 | Кнопка `Ⓑ`                                                        |
| `BTN_X` |        64 | Кнопка `Ⓧ`                                                        |
| `BTN_Y` |       128 | Кнопка `Ⓨ`                                                        |

Последовательность `△△▽▽◁▷◁▷ⒷⒶ` вызывает нажатие «клавиши» `KEY_CHEAT`.

## Графический Процессор

| Адрес  | Размер     | Описание                                                           |
|--------|-----------:|--------------------------------------------------------------------|
|  0007E |          1 | старшие биты UNICODE для сопоставления глифов шрифта               |
|  0007F |          1 | селектор банка спрайтов для карты                                  |
|  00080 |       1024 | палитра, 256 цветов, каждая запись 4 байта, RGBA                   |
|  00480 |          2 | x0, область обрезки X начинается в пикселях (для всех функций)     |
|  00482 |          2 | x1, область обрезки X заканчивается в пикселях                     |
|  00484 |          2 | y0, область обрезки Y начинается в пикселях                        |
|  00486 |          2 | y1, область обрезки Y заканчивается в пикселях                     |
|  00488 |          2 | отображается смещение vram X в пикселях или 0xffff                 |
|  0048A |          2 | отображается смещение vram Y в пикселях или 0xffff                 |
|  0048C |          1 | флаг с черепаховым загоном (см. [up], [down])                      |
|  0048D |          1 | черепаха цвет пера, индекс палитры от 0 до 255 (см. [color])       |
|  0048E |          2 | направление черепахи в градусах от 0 до 359 (см. [left], [right])  |
|  00490 |          2 | смещение черепахи по X в пикселях (см. [move])                     |
|  00492 |          2 | смещение черепахи по Y в пикселях                                  |
|  00494 |          2 | скорость ходьбы по лабиринту в 1/128 тайла (см. [maze])            |
|  00496 |          2 | скорость вращения лабиринта в градусах (от 1 до 90)                |
|  00498 |          1 | цвет переднего плана консоли, индекс палитры от 0 до 255 (см. [printf]) |
|  00499 |          1 | цвет фона консоли, индекс палитры от 0 до 255                      |
|  0049A |          2 | смещение консоли по X в пикселях                                   |
|  0049C |          2 | смещение консоли по Y в пикселях                                   |
|  0049E |          2 | смещение камеры по X в [3D-пространстве] (см. [tri3d], [tritx], [mesh]) |
|  004A0 |          2 | смещение камеры по Y                                               |
|  004A2 |          2 | смещение камеры по Z                                               |
|  004A4 |          2 | направление камеры, шаг (0 вверх, 90 вперед)                       |
|  004A6 |          2 | направление камеры, рыскание (0 влево, 90 вперед)                  |
|  004A8 |          1 | поле зрения камеры в углах (45, негатив дает ортографическое)      |
|  004AA |          2 | смещение положения источника света по X (см. [tri3d], [tritx], [mesh]) |
|  004AC |          2 | смещение положения источника света по Y                            |
|  004AE |          2 | смещение положения источника света по Z                            |
|  00600 |      64000 | карта, индексы спрайтов 320 x 200 (см. [map] и [maze])             |
|  10000 |      65536 | спрайты, индексы палитры 256 x 256, 1024 8 x 8 пикселей (см. [spr]) |
|  28000 |       2048 | окно для 4096 глифов шрифта (см. 0007E, [width] и [text])          |

## Цифровой Сигнальный Процессор

| Адрес  | Размер     | Описание                                                           |
|--------|-----------:|--------------------------------------------------------------------|
|  0007C |          1 | селектор банка сигналов (от 1 до 31)                               |
|  0007D |          1 | селектор банка музыкальных дорожек (от 0 до 7)                     |
|  004BA |          1 | текущий темп (в тиках на строку, только чтение)                    |
|  004BB |          1 | текущий воспроизводимый трек (только чтение)                       |
|  004BC |          2 | текущий воспроизведенная строка (только чтения)                    |
|  004BE |          2 | общее количество строк в текущей дорожке (только чтения)           |
|  004C0 |         64 | 16 регистров состояния канала, каждый по 4 байта (только чтение)   |
|  00500 |        256 | 64 звуковых эффекта, каждый по 4 байта                             |
|  20000 |      16384 | окно для образцов сигналов (см. 0007C)                             |
|  24000 |      16384 | окно музыкальных паттернов (см. 0007D)                             |

Все регистры состояния DSP доступны только для чтения и для каждого канала выглядят следующим
образом:

| Адрес  | Размер     | Описание                                                           |
|--------|-----------:|--------------------------------------------------------------------|
|      0 |          2 | текущая позиция в воспроизводимом сигнале                          |
|      2 |          1 | текущая форма сигнала (от 1 до 31, 0 если канал молчит)            |
|      3 |          1 | текущая громкость (0 означает, что канал выключен)                 |

Первые 4 канала предназначены для музыки, остальные для звуковых эффектов.

Обратите внимание, что индекс формы сигнала 0 означает «использовать предыдущую форму сигнала»,
поэтому индекс 0 нельзя использовать в селекторе. Формат любого другого сигнала:

| Адрес  | Размер     | Описание                                                           |
|--------|-----------:|--------------------------------------------------------------------|
|      0 |          2 | количество образцов                                                |
|      2 |          2 | начало цикла                                                       |
|      4 |          2 | длина петли                                                        |
|      6 |          1 | значение точной настройки, от -8 до 7                              |
|      7 |          1 | громкость, от 0 до 64                                              |
|      8 |      16376 | подписанные 8-битные моно сэмплы                                   |

Формат звуковых эффектов и музыкальных дорожек одинаковый, с той лишь разницей, что музыкальные
дорожки имеют по 4 ноты в строке, по одной на каждый канал, а всего 1024 строки; а для звуковых
эффектов всего одна нота и 64 ряда.

| Адрес  | Размер     | Описание                                                           |
|--------|-----------:|--------------------------------------------------------------------|
|      0 |          1 | номер ноты, см. макрос `NOTE_x`, от 0 до 96                        |
|      1 |          1 | индекс формы сигнала, от 0 до 31                                   |
|      2 |          1 | тип эффекта, от 0 до 255 (см. [Звуковые эффекты])                  |
|      3 |          1 | параметр эффекта                                                   |

Подсчет нот происходит следующим образом: 0 означает, что ноты не установлены. Далее следуют 8
октав, в каждой по 12 нот, поэтому 1 соответствует C-0, 12 - B-0 (самая нижняя октава), 13 - C-1
(на октаву выше) и 14 - C#1 (до-диез, на полтона выше). Например, нота ре в 4-й октаве будет
равна 1 + 4\*12 + 2 - 51. Нота B-7 равна 96, самой высокой ноте самой высокой октавы. У вас также
есть встроенные определения, например C-1 это `NOTE_C_1`, а C#1 это `NOTE_Cs1`. Если вы не хотите
считать, вы также можете использовать их в своей программе.

## Звуковые эффекты

Для простоты MEG-4 использует те же коды, что и файл Amiga MOD (таким образом, вы увидите то же
самое во встроенном редакторе, а также в стороннем музыкальном трекере), но он не поддерживает их
все. Как было сказано ранее, эти коды представлены тремя шестнадцатеричными числами, первое из
которых имеет тип `t`, а последние два — параметр `xy` (или `xx`). Все типы от `E1` до `ED` хранятся
в байте типа, хотя кажется, что один из их полубайтов может принадлежать параметру, но это не так.

| Эффект | Код  | Описание                                                   |
|--------|------|------------------------------------------------------------|
| ...    | 000  | Нет эффекта                                                |
| Arp    | 0xy  | Арпеджио, игра ноты, нота+x полутон и нота+y полутон       |
| Po/    | 1xx  | Портаменто вверх, период слайда на x вверх                 |
| Po\\   | 2xx  | Портаменто вниз, период слайда на x вниз                   |
| Ptn    | 3xx  | Тон портаменто, сдвиньте период от периода x               |
| Vib    | 4xy  | Вибрато, колебание высоты звука на y полутонов на частоте x |
| Ctv    | 5xy  | Продолжить тон портаменто + слайдер громкости на x вверх или y вниз |
| Cvv    | 6xy  | Продолжить вибрато + громкость на x вверх или на y вниз    |
| Trm    | 7xy  | Тремоло, колебание громкости по амплитуде y на частоте x   |
| Ofs    | 9xx  | Установите смещение выборки на x \* 256                    |
| Vls    | Axy  | Слайд громкости на x вверх или на y вниз                   |
| Jmp    | Bxx  | Переход к позиции, установите строку на x \* 64            |
| Vol    | Cxx  | Установите громкость на x                                  |
| Fp/    | E1x  | Тонкое портаменто вверх, период увеличения на x            |
| Fp\\   | E2x  | Тонкое портаменто вниз, период уменьшения на x             |
| Svw    | E4x  | Установите форму волны вибрато: 0 синус, 1 пила, 2 квадрат, 3 шум |
| Ftn    | E5x  | Установить точную настройку, изменить настройку на x (от -8 до 7) |
| Stw    | E7x  | Установите форму волны тремоло: 0 синус, 1 пила, 2 квадрат, 3 шум |
| Rtg    | E9x  | Перезапустить заметку, запускать текущую выборку каждые x тиков |
| Fv/    | EAx  | Тонкая регулировка громкости вверх, увеличение на x        |
| Fv\\   | EBx  | Тонкая регулировка громкости вниз, уменьшение на x         |
| Cut    | ECx  | Вырезать заметку в x тиков                                 |
| Dly    | EDx  | Задержка ноты в x тиков                                    |
| Tpr    | Fxx  | Установите количество тиков в строке равное x (по умолчанию равно 6) |

## Пользовательская память

Адреса памяти от 00000 до 2FFFF принадлежат MMIO, все, что выше (начиная с 30000 или `MEM_USER`), является
свободно используемой пользовательской памятью.

| Адрес  | Размер     | Описание                                                           |
|--------|-----------:|--------------------------------------------------------------------|
|  30000 |          4 | (только BASIC) смещение DATA                                       |
|  30004 |          4 | (только BASIC) текущий счетчик READ                                |
|  30008 |          4 | (только BASIC) максимальное READ, количество DATA                  |

Далее следуют глобальные переменные, которые вы объявили в своей программе, а затем константы,
например строковые литералы. В случае BASIC за этим следуют фактические записи DATA.

Адреса памяти над инициализированными данными могут быть динамически выделены и освобождены в
вашей программе с помощью вызовов [malloc] и [free].

Наконец, стек, который находится вверху (начиная с C0000 или `MEM_LIMIT`) и растет *вниз*. Сюда помещаются
локальные переменные вашей программы (которые вы объявили внутри функции). Размер стека всегда
меняется в зависимости от того, какая функция вызывает какую другую функцию в вашей программе.

Если по какой-либо причине верх динамически выделяемых данных и низ стека перекрываются, MEG-4 выдает
ошибку «Недостаточно памяти».

## Строка формата

Некоторые функции [printf], [sprintf] и [trace] используют строку формата, которая может содержать специальные
символы для ссылки на аргументы и описания способа их отображения. Это:

| Код  | Описание                                                   |
|------|------------------------------------------------------------|
| `%%` | Символ `%`                                                 |
| `%d` | Следующий параметр в виде десятичное число                 |
| `%u` | Следующий параметр в виде десятичное число без знака       |
| `%x` | Следующий параметр в виде шестнадцатеричное число          |
| `%o` | Следующий параметр в виде восьмеричное число               |
| `%b` | Следующий параметр в виде двоичного число                  |
| `%f` | Следующий параметр в виде числа с плавающей точкой         |
| `%s` | Следующий параметр в виде строки                           |
| `%c` | Следующий параметр в виде символа UTF-8                    |
| `%p` | Следующий параметр как адрес (указатель)                   |
| `\t` | Tab, измените вертикальное положение перед продолжением    |
| `\n` | Начать новую строку                                        |

Вы можете добавить отступы, указав длину между `%` и кодом. Если оно начинается с `0`, то значение будет
дополнено нулями, в противном случае — пробелами. Например, `%4d` дополнит значение справа пробелами,
а `%04x` — нулями. `f` принимает число после точки, которое указывает количество цифр в дробной части
(до 8), например. `%.6f`.

## 3D-пространстве

В MEG-4 трехмерное пространство обрабатывается по правилу правой руки: +X находится справа, +Y — вверху,
а +Z — по направлению к зрителю.

```
  +Y
   |
   |__ +X
  /
+Z
```

Каждая точка должна находиться в диапазоне от -32767 до +32767. То, как этот трехмерный мир проецируется
на ваш 2D-экран, зависит от того, как вы настроите камеру (см. адрес [Графический Процессор] 0049E). Конечно,
вам нужно разместить камеру в мире с координатами X, Y, Z. Затем вам нужно указать, куда смотрит камера,
используя наклон и рысканье. Наконец, вам также нужно указать тип объектива камеры, указав угол поля
зрения. Последний обычно должен составлять от 30 (очень узкий) до 180 градусов (как у рыб и птиц). MEG-4
поддерживает до 127 градусов, но есть хитрость. Положительные значения поля зрения будут проецироваться
в перспективе (чем дальше объект, тем он меньше), но отрицательные значения также обрабатываются, только
с помощью ортогональной проекции (независимо от расстояния, размер объекта будет одинаковым).
Перспектива используется в играх FPS, тогда как орфографическая проекция чаще всего предпочтительна в
стратегических играх.

Вы можете эффективно отобразить набор треугольников (полную 3D-модель), используя функцию [mesh].
Поскольку модели, вероятно, имеют локальные координаты, все модели будут нарисованы одна поверх другой
вокруг исходной точки. Поэтому, если вы хотите отобразить несколько моделей в мире, сначала вам следует
перевести их (поместить) в мировые координаты с помощью [trns], а затем использовать переведенное облако
вершин с помощью [mesh] (перемещение и вращение модели не будет измените треугольники, только координаты
их вершин).

## Сочетания клавиш редактора кода

Дополнительные [клавиатура] сочетания клавиш, которые вы также можете использовать при редактировании
исходного кода:

| Клавиша | Описание |
|-----------------------------|---------------------------------------------------------------------------------------|
| <kbd>Ctrl</kbd>+<kbd>F</kbd> | Найти строку |
| <kbd>Ctrl</kbd>+<kbd>G</kbd> | Найти снова |
| <kbd>Ctrl</kbd>+<kbd>H</kbd> | Поиск и замена (в выделенном тексте или, при его отсутствии, во всем исходном коде) |
| <kbd>Ctrl</kbd>+<kbd>J</kbd> | Перейти к строке |
| <kbd>Ctrl</kbd>+<kbd>D</kbd> | Перейти к определению функции |
| <kbd>Ctrl</kbd>+<kbd>N</kbd> | Список закладок |
| <kbd>Ctrl</kbd>+<kbd>B</kbd> | Переключить закладку на текущей строке |
| <kbd>Ctrl</kbd>+<kbd>▴</kbd> | Перейти к предыдущей закладке |
| <kbd>Ctrl</kbd>+<kbd>▾</kbd> | Перейти к следующей закладке |
| <kbd>Ctrl</kbd>+<kbd>◂</kbd> | Перейти к началу предыдущего слова |
| <kbd>Ctrl</kbd>+<kbd>▸</kbd> | Перейти к концу следующего слова |
| <kbd>Ctrl</kbd>+<kbd>,</kbd> | Уменьшить отступ выделения |
| <kbd>Ctrl</kbd>+<kbd>.</kbd> | Увеличить отступ выделения |
| <kbd>Home</kbd> | Переместить курсор в начало строки |
| <kbd>End</kbd> | Переместить курсор в конец строки |
| <kbd>PgUp</kbd> | Переместить курсор на 42 строки (одну страницу) вверх |
| <kbd>PgDown</kbd> | Переместить курсор на 42 строки (одну страницу) вниз |
| <kbd>F1</kbd> | Если курсор находится в списке аргументов API, перейти на встроенную страницу справки функции |

Независимо от раскладки клавиатуры платформы, все символы, необходимые для программирования (и не
только), всегда доступны:

| Левый <kbd>Alt</kbd> + |
|-----/------------------|
| <kbd> </kbd> <kbd>(</kbd> <kbd>)</kbd> <kbd>{</kbd> <kbd>}</kbd> <kbd>〈</kbd> <kbd>〉</kbd> <kbd>!</kbd> <kbd>^</kbd> <kbd>_</kbd> <kbd>-</kbd> <kbd>=</kbd> |
| <kbd>⇥</kbd> <kbd> </kbd> <kbd> </kbd> <kbd>€</kbd> <kbd>₹</kbd> <kbd>~</kbd> <kbd>¥</kbd> <kbd> </kbd> <kbd> </kbd> <kbd>°</kbd> <kbd>"</kbd> <kbd>\[</kbd> <kbd>\]</kbd> |
| <kbd>↨</kbd> <kbd>&</kbd> <kbd>$</kbd> <kbd>@</kbd> <kbd>¦</kbd> <kbd> </kbd> <kbd>#</kbd> <kbd> </kbd> <kbd> </kbd> <kbd>£</kbd> <kbd>;</kbd> <kbd>'</kbd> <kbd>\\</kbd> |
| <kbd>⇮</kbd> <kbd>:</kbd> <kbd>?</kbd> <kbd> </kbd> <kbd>元</kbd> <kbd>%</kbd> <kbd>+</kbd> <kbd>✶</kbd> <kbd>,</kbd> <kbd>.</kbd> <kbd>/</kbd> |

См. также меню для альтернативных методов ввода и их сочетаний клавиш.

# Консоль

## putc

```c
void putc(uint32_t chr)
```
<dl>
<dt>Описание</dt><dd>
Выводит символ на консоль.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| chr | Символ UTF-8 |
</dd>
</dl>
<hr>
## printf

```c
void printf(str_t fmt, ...)
```
<dl>
<dt>Описание</dt><dd>
Выводит текст на консоль.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| fmt | строка для отображения, [Строка формата] |
| ... | необязательные аргументы |
</dd>
</dl>
<hr>
## getc

```c
uint32_t getc(void)
```
<dl>
<dt>Описание</dt><dd>
Считывает символ из консоли, блокирует программу при отсутствии ввода.
</dd>
<dt>Возвращаемое значение</dt><dd>
Символ UTF-8, введенный пользователем.
</dd>
<dt>Смотрите также</dt><dd>
[popkey]
</dd>
</dl>
<hr>
## gets

```c
str_t gets(void)
```
<dl>
<dt>Описание</dt><dd>
Считывает строку, заканчивающуюся новой строкой, от пользователя (не возвращает новую строку).
</dd>
<dt>Возвращаемое значение</dt><dd>
Байты читаются в строке.
</dd>
</dl>
<hr>
## trace

```c
void trace(str_t fmt, ...)
```
<dl>
<dt>Описание</dt><dd>
Отслеживайте выполнение, выводя на стандартный вывод. Работает только в том случае, если `meg4`
был запущен с многословным флагом `-v`.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| fmt | [Строка формата] |
| ... | необязательные аргументы |
</dd>
</dl>
<hr>
## delay

```c
void delay(uint16_t msec)
```
<dl>
<dt>Описание</dt><dd>
Задерживает выполнение программы.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| msec | задержка в миллисекундах |
</dd>
</dl>
<hr>
## exit

```c
void exit(void)
```
<dl>
<dt>Описание</dt><dd>
Выход из программы.
</dd>
</dl>

# Аудио

## sfx

```c
void sfx(uint8_t sfx, uint8_t channel, uint8_t volume)
```
<dl>
<dt>Описание</dt><dd>
Воспроизводит звуковой эффект.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| sfx | индекс звукового эффекта, от 0 до 63 |
| channel | используемый канал, от 0 до 11 |
| volume | громкость, которая будет использоваться, от 0 до 255, 0 отключает канал |
</dd>
</dl>
<hr>
## music

```c
void music(uint8_t track, uint16_t row, uint8_t volume)
```
<dl>
<dt>Описание</dt><dd>
Воспроизводит музыкальную дорожку.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| track | индекс музыкальной дорожки, от 0 до 7 |
| row | строка начала воспроизведения, от 0 до 1023 (максимальная длина песни) |
| volume | используемая громкость, от 0 до 255, 0 отключает музыку |
</dd>
</dl>

# GPIO

## gpio_rev

```c
uint32_t gpio_rev(void)
```
<dl>
<dt>Описание</dt><dd>
Запросите номер версии платы GPIO. Возвращает 0, если платформа не поддерживает GPIO.
</dd>
<dt>Возвращаемое значение</dt><dd>
Номер версии платы или 0, если не поддерживается.
</dd>
</dl>
<hr>
## gpio_get

```c
int gpio_get(uint8_t pin)
```
<dl>
<dt>Описание</dt><dd>
Прочтите значение контакта GPIO.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| pin | физический номер контакта, от 1 до 40 |
</dd>
<dt>Возвращаемое значение</dt><dd>
Возвращает 1, если на выводе высокий уровень, 0, если он низкий, -1 в случае ошибки (вывод
GPIO не поддерживается).
</dd>
<dt>Смотрите также</dt><dd>
[gpio_set]
</dd>
</dl>
<hr>
## gpio_set

```c
int gpio_set(uint8_t pin, int value)
```
<dl>
<dt>Описание</dt><dd>
Запишите значение на вывод GPIO.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| pin | физический номер контакта, от 1 до 40 |
| value | 1 для установки высокого уровня, 0 для низкого уровня |
</dd>
<dt>Возвращаемое значение</dt><dd>
Возвращает 0 в случае успеха, -1 в случае ошибки (вывод GPIO не поддерживается).
</dd>
<dt>Смотрите также</dt><dd>
[gpio_get]
</dd>
</dl>

# Графика

## cls

```c
void cls(uint8_t palidx)
```
<dl>
<dt>Описание</dt><dd>
Очищает весь экран и сбрасывает смещения дисплея, а также устанавливает цвет фона консоли.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| palidx | цвет, индекс палитры от 0 до 255 |
</dd>
<dt>Смотрите также</dt><dd>
[pget], [pset]
</dd>
</dl>
<hr>
## cget

```c
uint32_t cget(uint16_t x, uint16_t y)
```
<dl>
<dt>Описание</dt><dd>
Получите пиксель по координате и верните цвет RGBA.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| x | координата X в пикселях |
| y | координата Y в пикселях |
</dd>
<dt>Возвращаемое значение</dt><dd>
Упакованный цвет с каналами RGBA (красный находится в младшем байте).
</dd>
<dt>Смотрите также</dt><dd>
[cls], [pget], [pset]
</dd>
</dl>
<hr>
## pget

```c
uint8_t pget(uint16_t x, uint16_t y)
```
<dl>
<dt>Описание</dt><dd>
Получите пиксель по координате и верните индекс его палитры.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| x | координата X в пикселях |
| y | координата Y в пикселях |
</dd>
<dt>Возвращаемое значение</dt><dd>
Индекс цвета в палитре от 0 до 255.
</dd>
<dt>Смотрите также</dt><dd>
[cls], [pset], [cget]
</dd>
</dl>
<hr>
## pset

```c
void pset(uint8_t palidx, uint16_t x, uint16_t y)
```
<dl>
<dt>Описание</dt><dd>
Отображает пиксель по координате.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| palidx | цвет, индекс палитры от 0 до 255 |
| x | координата X в пикселях |
| y | координата Y в пикселях |
</dd>
<dt>Смотрите также</dt><dd>
[cls], [pget]
</dd>
</dl>
<hr>
## width

```c
uint16_t width(int8_t type, str_t str)
```
<dl>
<dt>Описание</dt><dd>
Возвращает ширину отображаемого текста в пикселях.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| type | тип шрифта, от -4 до 4 |
| str | струна, которую нужно измерить |
</dd>
<dt>Возвращаемое значение</dt><dd>
Количество пикселей, необходимое для отображения текста.
</dd>
<dt>Смотрите также</dt><dd>
[text]
</dd>
</dl>
<hr>
## text

```c
void text(uint8_t palidx, int16_t x, int16_t y, int8_t type, uint8_t shidx, uint8_t sha, str_t str)
```
<dl>
<dt>Описание</dt><dd>
Выводит текст на экран.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| palidx | цвет, индекс палитры от 0 до 255 |
| x | координата X в пикселях |
| y | координата Y в пикселях |
| type | тип шрифта, моноширинный от -4 до -1, пропорциональный от 1 до 4 |
| shidx | цвет тени, индекс палитры от 0 до 255 |
| sha | альфа тени, от 0 (полностью прозрачная) до 255 (полностью непрозрачная) |
| str | строка для отображения |
</dd>
<dt>Смотрите также</dt><dd>
[width]
</dd>
</dl>
<hr>
## line

```c
void line(uint8_t palidx, int16_t x0, int16_t y0, int16_t x1, int16_t y1)
```
<dl>
<dt>Описание</dt><dd>
Рисует сглаженную линию.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| palidx | цвет, индекс палитры от 0 до 255 |
| x0 | начальная координата X в пикселях |
| y0 | начальная координата Y в пикселях |
| x1 | конечная координата X в пикселях |
| y1 | конечная координата Y в пикселях |
</dd>
<dt>Смотрите также</dt><dd>
[qbez], [cbez]
</dd>
</dl>
<hr>
## qbez

```c
void qbez(uint8_t palidx, int16_t x0, int16_t y0, int16_t x1, int16_t y1,
    int16_t cx, int16_t cy)
```
<dl>
<dt>Описание</dt><dd>
Рисует квадратичную кривую Безье.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| palidx | цвет, индекс палитры от 0 до 255 |
| x0 | начальная координата X в пикселях |
| y0 | начальная координата Y в пикселях |
| x1 | конечная координата X в пикселях |
| y1 | конечная координата Y в пикселях |
| cx | координата контрольной точки X в пикселях |
| cy | координата контрольной точки Y в пикселях |
</dd>
<dt>Смотрите также</dt><dd>
[line], [cbez]
</dd>
</dl>
<hr>
## cbez

```c
void cbez(uint8_t palidx, int16_t x0, int16_t y0, int16_t x1, int16_t y1,
    int16_t cx0, int16_t cy0, int16_t cx1, int16_t cy1)
```
<dl>
<dt>Описание</dt><dd>
Рисует кубическую кривую Безье.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| palidx | цвет, индекс палитры от 0 до 255 |
| x0 | начальная координата X в пикселях |
| y0 | начальная координата Y в пикселях |
| x1 | конечная координата X в пикселях |
| y1 | конечная координата Y в пикселях |
| cx0 | координата X первой контрольной точки в пикселях |
| cy0 | координата Y первой контрольной точки в пикселях |
| cx1 | координата X второй контрольной точки в пикселях |
| cy1 | координата Y второй контрольной точки в пикселях |
</dd>
<dt>Смотрите также</dt><dd>
[line], [qbez]
</dd>
</dl>
<hr>
## tri

```c
void tri(uint8_t palidx, int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2)
```
<dl>
<dt>Описание</dt><dd>
Рисует треугольник.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| palidx | цвет, индекс палитры от 0 до 255 |
| x0 | координата X первого края в пикселях |
| y0 | координата Y первого края в пикселях |
| x1 | координата X второго края в пикселях |
| y1 | координата Y второго края в пикселях |
| x2 | координата X третьего края в пикселях |
| y2 | координата Y третьего края в пикселях |
</dd>
<dt>Смотрите также</dt><dd>
[ftri], [tri2d], [tri3d], [tritx], [mesh], [trns]
</dd>
</dl>
<hr>
## ftri

```c
void ftri(uint8_t palidx, int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2)
```
<dl>
<dt>Описание</dt><dd>
Рисует заполненный треугольник.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| palidx | цвет, индекс палитры от 0 до 255 |
| x0 | координата X первого края в пикселях |
| y0 | координата Y первого края в пикселях |
| x1 | координата X второго края в пикселях |
| y1 | координата Y второго края в пикселях |
| x2 | координата X третьего края в пикселях |
| y2 | координата Y третьего края в пикселях |
</dd>
<dt>Смотрите также</dt><dd>
[tri], [tri2d], [tri3d], [tritx], [mesh], [trns]
</dd>
</dl>
<hr>
## tri2d

```c
void tri2d(uint8_t pi0, int16_t x0, int16_t y0,
    uint8_t pi1, int16_t x1, int16_t y1,
    uint8_t pi2, int16_t x2, int16_t y2)
```
<dl>
<dt>Описание</dt><dd>
Рисует заполненный треугольник с цветовыми градиентами.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| pi0 | цвет первого края, индекс палитры от 0 до 255 |
| x0 | координата X первого края в пикселях |
| y0 | координата Y первого края в пикселях |
| pi1 | цвет второго края, индекс палитры от 0 до 255 |
| x1 | координата X второго края в пикселях |
| y1 | координата Y второго края в пикселях |
| pi2 | цвет третьего края, индекс палитры от 0 до 255 |
| x2 | координата X третьего края в пикселях |
| y2 | координата Y третьего края в пикселях |
</dd>
<dt>Смотрите также</dt><dd>
[tri], [ftri], [tri3d], [tritx], [mesh], [trns]
</dd>
</dl>
<hr>
## tri3d

```c
void tri3d(uint8_t pi0, int16_t x0, int16_t y0, int16_t z0,
    uint8_t pi1, int16_t x1, int16_t y1, int16_t z1,
    uint8_t pi2, int16_t x2, int16_t y2, int16_t z2)
```
<dl>
<dt>Описание</dt><dd>
Рисует заполненный треугольник с цветовыми градиентами в [3D-пространстве].
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| pi0 | цвет первого края, индекс палитры от 0 до 255 |
| x0 | координата X первого края в пространстве |
| y0 | координата Y первого края в пространстве |
| z0 | координата Z первого края в пространстве |
| pi1 | цвет второго края, индекс палитры от 0 до 255 |
| x1 | координата X второго края в пространстве |
| y1 | координата Y второго края в пространстве |
| z1 | координата Z второго края в пространстве |
| pi2 | цвет третьего края, индекс палитры от 0 до 255 |
| x2 | координата X третьего края в пространстве |
| y2 | координата Y третьего края в пространстве |
| z2 | координата Z третьего края в пространстве |
</dd>
<dt>Смотрите также</dt><dd>
[tri], [ftri], [tri2d], [tritx], [mesh], [trns]
</dd>
</dl>
<hr>
## tritx

```c
void tritx(uint8_t u0, uint8_t v0, int16_t x0, int16_t y0, int16_t z0,
    uint8_t u1, uint8_t v1, int16_t x1, int16_t y1, int16_t z1,
    uint8_t u2, uint8_t v2, int16_t x2, int16_t y2, int16_t z2)
```
<dl>
<dt>Описание</dt><dd>
Рисует текстурированный треугольник в [3D-пространстве].
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| u0 | координата X первой текстуры края от 0 до 255 |
| v0 | координата Y первой текстуры края от 0 до 255 |
| x0 | координата X первого края в пространстве |
| y0 | координата Y первого края в пространстве |
| z0 | координата Z первого края в пространстве |
| u1 | координата X текстуры второго края от 0 до 255 |
| v1 | координата Y текстуры второго края от 0 до 255 |
| x1 | координата X второго края в пространстве |
| y1 | координата Y второго края в пространстве |
| z1 | координата Z второго края в пространстве |
| u2 | координата X текстуры третьего края от 0 до 255 |
| v2 | координата Y текстуры третьего края от 0 до 255 |
| x2 | координата X третьего края в пространстве |
| y2 | координата Y третьего края в пространстве |
| z2 | координата Z третьего края в пространстве |
</dd>
<dt>Смотрите также</dt><dd>
[tri], [ftri], [tri2d], [tri3d], [mesh], [trns]
</dd>
</dl>
<hr>
## mesh

```c
void mesh(addr_t verts, addr_t uvs, uint16_t numtri, addr_t tris)
```
<dl>
<dt>Описание</dt><dd>
Рисует сетку из треугольников в [3D-пространстве], используя индексы вершин и координаты текстуры (или палитру).
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| verts | адрес массива вершин, 3 х 2 байта каждый, X, Y, Z |
| uvs | адрес UV-массива (если 0, то используется палитра), 2 х 1 байт каждый, текстура X, Y |
| numtri | количество треугольников |
| tris | адрес массива треугольников с индексами по 6 х 1 байт каждый, vi1, ui1/pi1, vi2, ui2/pi2, vi3, ui3/pi3 |
</dd>
<dt>Смотрите также</dt><dd>
[tri], [ftri], [tri2d], [tri3d], [tritx], [trns]
</dd>
</dl>
<hr>
## rect

```c
void rect(uint8_t palidx, int16_t x0, int16_t y0, int16_t x1, int16_t y1)
```
<dl>
<dt>Описание</dt><dd>
Рисует прямоугольник.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| palidx | цвет, индекс палитры от 0 до 255 |
| x0 | координата X в верхнем левом углу в пикселях |
| y0 | координата Y в верхнем левом углу в пикселях |
| x1 | координата X в нижнем правом углу в пикселях |
| y1 | координата Y в нижнем правом углу в пикселях |
</dd>
<dt>Смотрите также</dt><dd>
[frect]
</dd>
</dl>
<hr>
## frect

```c
void frect(uint8_t palidx, int16_t x0, int16_t y0, int16_t x1, int16_t y1)
```
<dl>
<dt>Описание</dt><dd>
Рисует заполненный прямоугольник.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| palidx | цвет, индекс палитры от 0 до 255 |
| x0 | координата X в верхнем левом углу в пикселях |
| y0 | координата Y в верхнем левом углу в пикселях |
| x1 | координата X в нижнем правом углу в пикселях |
| y1 | координата Y в нижнем правом углу в пикселях |
</dd>
<dt>Смотрите также</dt><dd>
[rect]
</dd>
</dl>
<hr>
## circ

```c
void circ(uint8_t palidx, int16_t x, int16_t y, uint16_t r)
```
<dl>
<dt>Описание</dt><dd>
Рисует круг.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| palidx | цвет, индекс палитры от 0 до 255 |
| x | координата центра X в пикселях |
| y | координата центра Y в пикселях |
| r | радиус в пикселях |
</dd>
<dt>Смотрите также</dt><dd>
[fcirc], [ellip], [fellip]
</dd>
</dl>
<hr>
## fcirc

```c
void fcirc(uint8_t palidx, int16_t x, int16_t y, uint16_t r)
```
<dl>
<dt>Описание</dt><dd>
Рисует заполненный круг.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| palidx | цвет, индекс палитры от 0 до 255 |
| x | координата центра X в пикселях |
| y | координата центра Y в пикселях |
| r | радиус в пикселях |
</dd>
<dt>Смотрите также</dt><dd>
[circ], [ellip], [fellip]
</dd>
</dl>
<hr>
## ellip

```c
void ellip(uint8_t palidx, int16_t x0, int16_t y0, int16_t x1, int16_t y1)
```
<dl>
<dt>Описание</dt><dd>
Рисует эллипс.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| palidx | цвет, индекс палитры от 0 до 255 |
| x0 | координата X в верхнем левом углу в пикселях |
| y0 | координата Y в верхнем левом углу в пикселях |
| x1 | координата X в нижнем правом углу в пикселях |
| y1 | координата Y в нижнем правом углу в пикселях |
</dd>
<dt>Смотрите также</dt><dd>
[circ], [fcirc], [fellip]
</dd>
</dl>
<hr>
## fellip

```c
void fellip(uint8_t palidx, int16_t x0, int16_t y0, int16_t x1, int16_t y1)
```
<dl>
<dt>Описание</dt><dd>
Рисует заполненный эллипс.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| palidx | цвет, индекс палитры от 0 до 255 |
| x0 | координата X в верхнем левом углу в пикселях |
| y0 | координата Y в верхнем левом углу в пикселях |
| x1 | координата X в нижнем правом углу в пикселях |
| y1 | координата Y в нижнем правом углу в пикселях |
</dd>
<dt>Смотрите также</dt><dd>
[circ], [fcirc], [ellip]
</dd>
</dl>
<hr>
## move

```c
void move(int16_t x, int16_t y, uint16_t deg)
```
<dl>
<dt>Описание</dt><dd>
Перемещает черепаху в заданную позицию на экране или в лабиринте.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| x | координата X в пикселях (или 1/128 тайла с [maze]) |
| y | координата Y в пикселях |
| deg | направление в градусах, от 0 до 359, 0 - вверх на экране, 90 - вправо |
</dd>
<dt>Смотрите также</dt><dd>
[left], [right], [up], [down], [color], [forw], [back]
</dd>
</dl>
<hr>
## left

```c
void left(uint16_t deg)
```
<dl>
<dt>Описание</dt><dd>
Поворачивает черепаху налево.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| deg | изменение в градусах, от 0 до 359 |
</dd>
<dt>Смотрите также</dt><dd>
[move], [right], [up], [down], [color], [forw], [back]
</dd>
</dl>
<hr>
## right

```c
void right(uint16_t deg)
```
<dl>
<dt>Описание</dt><dd>
Поворачивает черепаху вправо.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| deg | изменение в градусах, от 0 до 359 |
</dd>
<dt>Смотрите также</dt><dd>
[move], [left], [up], [down], [color], [forw], [back]
</dd>
</dl>
<hr>
## up

```c
void up(void)
```
<dl>
<dt>Описание</dt><dd>
Поднимает черепахе хвост. Черепаха будет двигаться, не рисуя линии.
</dd>
<dt>Смотрите также</dt><dd>
[move], [left], [right], [down], [color], [forw], [back]
</dd>
</dl>
<hr>
## down

```c
void down(void)
```
<dl>
<dt>Описание</dt><dd>
Опускает хвост черепахи. Черепаха будет двигаться, рисуя линию (см. [color]).
</dd>
<dt>Смотрите также</dt><dd>
[move], [left], [right], [up], [color], [forw], [back]
</dd>
</dl>
<hr>
## color

```c
void color(uint8_t palidx)
```
<dl>
<dt>Описание</dt><dd>
Устанавливает цвет краски черепахи.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| palidx | цвет, индекс палитры от 0 до 255 |
</dd>
<dt>Смотрите также</dt><dd>
[move], [left], [right], [up], [down], [forw], [back]
</dd>
</dl>
<hr>
## forw

```c
void forw(uint16_t cnt)
```
<dl>
<dt>Описание</dt><dd>
Перемещает черепаху вперед.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| cnt | сумма в пикселях (или 1/128 тайла с [maze]) |
</dd>
<dt>Смотрите также</dt><dd>
[move], [left], [right], [up], [down], [color], [back]
</dd>
</dl>
<hr>
## back

```c
void back(uint16_t cnt)
```
<dl>
<dt>Описание</dt><dd>
Перемещает черепаху назад.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| cnt | сумма в пикселях (или 1/128 тайла с [maze]) |
</dd>
<dt>Смотрите также</dt><dd>
[move], [left], [right], [up], [down], [color], [forw]
</dd>
</dl>
<hr>
## spr

```c
void spr(int16_t x, int16_t y, uint16_t sprite, uint8_t sw, uint8_t sh, int8_t scale, uint8_t type)
```
<dl>
<dt>Описание</dt><dd>
Отображает спрайт или несколько соседних спрайтов.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| x | координата X в пикселях |
| y | координата Y в пикселях |
| sprite | идентификатор спрайта, от 0 до 1023 |
| sw | количество горизонтальных спрайтов |
| sh | количество вертикальных спрайтов |
| scale | масштаб, от -3 до 4 |
| type | преобразование, 0=норм., 1=пов. 90, 2=пов. 180, 3=пов. 270, 4=пер. верт., 5=пер.+90, 6=пер. гориз., 7=пер.+270 |
</dd>
<dt>Смотрите также</dt><dd>
[dlg], [stext]
</dd>
</dl>
<hr>
## dlg

```c
void dlg(int16_t x, int16_t y, uint16_t w, uint16_t h, int8_t scale,
    uint16_t tl, uint16_t tm, uint16_t tr,
    uint16_t ml, uint16_t bg, uint16_t mr,
    uint16_t bl, uint16_t bm, uint16_t br)
```
<dl>
<dt>Описание</dt><dd>
Отображает диалоговое окно с использованием спрайтов.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| x | координата X в пикселях |
| y | координата Y в пикселях |
| w | ширина диалога в пикселях |
| h | высота диалога в пикселях |
| scale | масштаб, от -3 до 4 |
| tl | идентификатор спрайта в верхнем левом углу |
| tm | идентификатор верхнего среднего спрайта |
| tr | идентификатор спрайта в правом верхнем углу |
| ml | идентификатор среднего левого спрайта |
| bg | идентификатор фонового спрайта |
| mr | идентификатор среднего правого спрайта |
| bl | идентификатор спрайта в левом нижнем углу |
| bm | идентификатор нижнего среднего спрайта |
| br | идентификатор спрайта в правом нижнем углу |
</dd>
<dt>Смотрите также</dt><dd>
[spr], [stext]
</dd>
</dl>
<hr>
## stext

```c
void stext(int16_t x, int16_t y, uint16_t fs, uint16_t fu, uint8_t sw, uint8_t sh, int8_t scale, str_t str)
```
<dl>
<dt>Описание</dt><dd>
Отображает текст на экране с помощью спрайтов.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| x | координата X в пикселях |
| y | координата Y в пикселях |
| fs | первый идентификатор спрайта, который будет использоваться для отображения |
| fu | первый UNICODE (наименьший символ) в строке |
| sw | количество горизонтальных спрайтов |
| sh | количество вертикальных спрайтов |
| scale | масштаб, от -3 до 4 |
| str | строка UTF-8 с нулевым завершением |
</dd>
<dt>Смотрите также</dt><dd>
[spr], [dlg]
</dd>
</dl>
<hr>
## remap

```c
void remap(addr_t replace)
```
<dl>
<dt>Описание</dt><dd>
Заменяет плитки на карте. Может использоваться для анимации плиток на карте.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| replace | массив из 256 идентификаторов спрайтов |
</dd>
<dt>Смотрите также</dt><dd>
[mget], [mset], [map], [maze]
</dd>
</dl>
<hr>
## mget

```c
uint16_t mget(uint16_t mx, uint16_t my)
```
<dl>
<dt>Описание</dt><dd>
Возвращает один тайл на карте.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| mx | координата X на карте в плитках |
| my | координата Y на карте в плитках |
</dd>
<dt>Возвращаемое значение</dt><dd>
Идентификатор спрайта плитки по данной координате.
</dd>
<dt>Смотрите также</dt><dd>
[remap], [mset], [map], [maze]
</dd>
</dl>
<hr>
## mset

```c
void mset(uint16_t mx, uint16_t my, uint16_t sprite)
```
<dl>
<dt>Описание</dt><dd>
Устанавливает одну плитку на карту.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| mx | координата X на карте в плитках |
| my | координата Y на карте в плитках |
| sprite | идентификатор спрайта, от 0 до 1023 |
</dd>
<dt>Смотрите также</dt><dd>
[remap], [mget], [map], [maze]
</dd>
</dl>
<hr>
## map

```c
void map(int16_t x, int16_t y, uint16_t mx, uint16_t my, uint16_t mw, uint16_t mh, int8_t scale)
```
<dl>
<dt>Описание</dt><dd>
Рисует (частично) карту.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| x | координата X в пикселях |
| y | координата Y в пикселях |
| mx | координата X на карте в плитках |
| my | координата Y на карте в плитках |
| mw | количество горизонтальных плиток |
| mh | количество вертикальных плиток |
| scale | масштаб, от -3 до 4 |
</dd>
<dt>Смотрите также</dt><dd>
[remap], [mget], [mset], [maze]
</dd>
</dl>
<hr>
## maze

```c
void maze(uint16_t mx, uint16_t my, uint16_t mw, uint16_t mh, uint8_t scale,
    uint16_t sky, uint16_t grd, uint16_t door, uint16_t wall, uint16_t obj, uint8_t numnpc, addr_t npc)
```
<dl>
<dt>Описание</dt><dd>
Отображает карту в виде трехмерного лабиринта с использованием положения черепахи.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| mx | координата X на карте в плитках |
| my | координата Y на карте в плитках |
| mw | количество горизонтальных плиток |
| mh | количество вертикальных плиток |
| scale | количество спрайтов на тайл в степени двойки, от 0 до 3 |
| sky | индекс неба плитки |
| grd | индекс наземной плитки |
| door | индекс первой двери плитки |
| wall | индекс первой настенной плитки |
| obj | индекс первой объекта плитки |
| numnpc | количество записей NPC |
| npc | массив uint32_t, состоящий из numnpc, умноженных на x, y, тройки индексов плитки |
</dd>
<dt>Смотрите также</dt><dd>
[remap], [mget], [mset], [map]
</dd>
</dl>

# Вход

## getpad

```c
int getpad(int pad, int btn)
```
<dl>
<dt>Описание</dt><dd>
Получает текущее состояние кнопки геймпада.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| pad | индекс геймпада, от 0 до 3 |
| btn | одна из кнопок [Геймпад]а, `BTN_` |
</dd>
<dt>Возвращаемое значение</dt><dd>
Ноль, если не нажата, ненулевая, если нажата.
</dd>
<dt>Смотрите также</dt><dd>
[prspad], [relpad], [getbtn], [getclk], [getkey]
</dd>
</dl>
<hr>
## prspad

```c
int prspad(int pad, int btn)
```
<dl>
<dt>Описание</dt><dd>
Возвращает true, если кнопка геймпада была нажата с момента последнего вызова.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| pad | индекс геймпада, от 0 до 3 |
| btn | одна из кнопок [Геймпад]а, `BTN_` |
</dd>
<dt>Возвращаемое значение</dt><dd>
Ноль, если не нажата, ненулевая, если нажата.
</dd>
<dt>Смотрите также</dt><dd>
[relpad], [getpad], [getbtn], [getclk], [getkey]
</dd>
</dl>
<hr>
## relpad

```c
int relpad(int pad, int btn)
```
<dl>
<dt>Описание</dt><dd>
Возвращает true, если кнопка геймпада была отпущена с момента последнего вызова.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| pad | индекс геймпада, от 0 до 3 |
| btn | одна из кнопок [Геймпад]а, `BTN_` |
</dd>
<dt>Возвращаемое значение</dt><dd>
Ноль, если не был выпущен, ненулевой, если выпущен.
</dd>
<dt>Смотрите также</dt><dd>
[prspad], [getpad], [getbtn], [getclk], [getkey]
</dd>
</dl>
<hr>
## getbtn

```c
int getbtn(int btn)
```
<dl>
<dt>Описание</dt><dd>
Получает состояние кнопок мыши.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| btn | одна из кнопок [Указатель], `BTN_` или `SCR_` |
</dd>
<dt>Возвращаемое значение</dt><dd>
Ноль, если не нажата, ненулевая, если нажата.
</dd>
<dt>Смотрите также</dt><dd>
[prspad], [relpad], [getpad], [getclk], [getkey]
</dd>
</dl>
<hr>
## getclk

```c
int getclk(int btn)
```
<dl>
<dt>Описание</dt><dd>
Получает щелчок кнопкой мыши.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| btn | одна из кнопок [Указатель], `BTN_` |
</dd>
<dt>Возвращаемое значение</dt><dd>
Ноль, если не нажимать, и ненулевое значение, если нажимать.
</dd>
<dt>Смотрите также</dt><dd>
[prspad], [relpad], [getpad], [getbtn], [getkey]
</dd>
</dl>
<hr>
## getkey

```c
int getkey(int sc)
```
<dl>
<dt>Описание</dt><dd>
Получает текущее состояние ключа.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| sc | сканкод, от 1 до 144, см. [Клавиатура] |
</dd>
<dt>Возвращаемое значение</dt><dd>
Ноль, если не нажата, ненулевая, если нажата.
</dd>
<dt>Смотрите также</dt><dd>
[prspad], [relpad], [getpad], [getbtn], [getclk]
</dd>
</dl>
<hr>
## popkey

```c
uint32_t popkey(void)
```
<dl>
<dt>Описание</dt><dd>
Извлеките ключ UTF-8 из очереди клавиатуры. См. [Клавиатура] и версию блокировки [getc].
</dd>
<dt>Возвращаемое значение</dt><dd>
Представление ключа в кодировке UTF-8 или 0, если очередь пуста (без блокировки).
</dd>
<dt>Смотрите также</dt><dd>
[pendkey], [lenkey], [speckey], [getc]
</dd>
</dl>
<hr>
## pendkey

```c
int pendkey(void)
```
<dl>
<dt>Описание</dt><dd>
Возвращает true, если в очереди находится ключ (но оставляет ключ в очереди, а не удаляет его).
</dd>
<dt>Возвращаемое значение</dt><dd>
Возвращает 1, если в очереди есть ключи.
</dd>
<dt>Смотрите также</dt><dd>
[popkey], [lenkey], [speckey]
</dd>
</dl>
<hr>
## lenkey

```c
int lenkey(uint32_t key)
```
<dl>
<dt>Описание</dt><dd>
Возвращает длину ключа UTF-8 в байтах.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| key | ключ, вытащенный из очереди |
</dd>
<dt>Возвращаемое значение</dt><dd>
Длина представления UTF-8 в байтах.
</dd>
<dt>Смотрите также</dt><dd>
[popkey], [pendkey], [speckey]
</dd>
</dl>
<hr>
## speckey

```c
int speckey(uint32_t key)
```
<dl>
<dt>Описание</dt><dd>
Возвращает true, если ключ является специальным ключом.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| key | ключ, вытащенный из очереди |
</dd>
<dt>Возвращаемое значение</dt><dd>
Возвращает 1, если это специальный ключ, и 0, если его можно распечатать.
</dd>
<dt>Смотрите также</dt><dd>
[popkey], [pendkey], [lenkey]
</dd>
</dl>

# Математика

## rand

```c
uint32_t rand(void)
```
<dl>
<dt>Описание</dt><dd>
Получить случайный. Используйте `%` по модулю, чтобы уменьшить его, например, `1 + rand() % 6` возвращает
случайное число от 1 до 6, как игральная кость.
</dd>
<dt>Возвращаемое значение</dt><dd>
Случайное число от 0 до 2^^32^^-1 (4294967295).
</dd>
<dt>Смотрите также</dt><dd>
[rnd]
</dd>
</dl>
<hr>
## rnd

```c
float rnd(void)
```
<dl>
<dt>Описание</dt><dd>
Получить случайный. То же, что и [rand], но возвращает число с плавающей запятой.
</dd>
<dt>Возвращаемое значение</dt><dd>
Случайное число от 0.0 до 1.0.
</dd>
<dt>Смотрите также</dt><dd>
[rand]
</dd>
</dl>
<hr>
## float

```c
float float(int val)
```
<dl>
<dt>Описание</dt><dd>
Возвращает эквивалент целого числа с плавающей запятой.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| val | ценить |
</dd>
<dt>Возвращаемое значение</dt><dd>
Значение с плавающей запятой.
</dd>
<dt>Смотрите также</dt><dd>
[int]
</dd>
</dl>
<hr>
## int

```c
int int(float val)
```
<dl>
<dt>Описание</dt><dd>
Возвращает целочисленный эквивалент числа с плавающей запятой.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| val | ценить |
</dd>
<dt>Возвращаемое значение</dt><dd>
The integer of value.
</dd>
<dt>Смотрите также</dt><dd>
[float]
</dd>
</dl>
<hr>
## floor

```c
float floor(float val)
```
<dl>
<dt>Описание</dt><dd>
Возвращает наибольшее целое число, не превышающее значение.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| val | ценить |
</dd>
<dt>Возвращаемое значение</dt><dd>
Минимальная стоимость.
</dd>
<dt>Смотрите также</dt><dd>
[ceil]
</dd>
</dl>
<hr>
## ceil

```c
float ceil(float val)
```
<dl>
<dt>Описание</dt><dd>
Возвращает наименьшее целое число, не меньшее value.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| val | ценить |
</dd>
<dt>Возвращаемое значение</dt><dd>
Потолок стоимости.
</dd>
<dt>Смотрите также</dt><dd>
[floor]
</dd>
</dl>
<hr>
## sgn

```c
float sgn(float val)
```
<dl>
<dt>Описание</dt><dd>
Возвращает знак значения.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| val | ценить |
</dd>
<dt>Возвращаемое значение</dt><dd>
Либо 1.0, либо -1.0.
</dd>
<dt>Смотрите также</dt><dd>
[abs]
</dd>
</dl>
<hr>
## abs

```c
float abs(float val)
```
<dl>
<dt>Описание</dt><dd>
Возвращает абсолютное значение.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| val | ценить |
</dd>
<dt>Возвращаемое значение</dt><dd>
Либо значение, либо -значение, всегда положительное.
</dd>
<dt>Смотрите также</dt><dd>
[sgn]
</dd>
</dl>
<hr>
## exp

```c
float exp(float val)
```
<dl>
<dt>Описание</dt><dd>
Возвращает экспоненту значения, т. е. основание натуральных логарифмов, возведенное в степень значения.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| val | ценить |
</dd>
<dt>Возвращаемое значение</dt><dd>
Возвращает e^^val^^.
</dd>
<dt>Смотрите также</dt><dd>
[log], [pow]
</dd>
</dl>
<hr>
## log

```c
float log(float val)
```
<dl>
<dt>Описание</dt><dd>
Возвращает натуральный логарифм значения.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| val | ценить |
</dd>
<dt>Возвращаемое значение</dt><dd>
Возвращает натуральный логарифм значения.
</dd>
<dt>Смотрите также</dt><dd>
[exp]
</dd>
</dl>
<hr>
## pow

```c
float pow(float val, float exp)
```
<dl>
<dt>Описание</dt><dd>
Возвращает значение, возведенное в степень экспоненты. Это медленная операция, старайтесь ее избегать.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| val | ценить |
| exp | экспонента |
</dd>
<dt>Возвращаемое значение</dt><dd>
Возвращает val^^exp^^.
</dd>
<dt>Смотрите также</dt><dd>
[exp], [sqrt], [rsqrt]
</dd>
</dl>
<hr>
## sqrt

```c
float sqrt(float val)
```
<dl>
<dt>Описание</dt><dd>
Возвращает квадратный корень значения. Это медленная операция, старайтесь ее избегать.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| val | ценить |
</dd>
<dt>Возвращаемое значение</dt><dd>
Квадратный корень из значения.
</dd>
<dt>Смотрите также</dt><dd>
[pow], [rsqrt]
</dd>
</dl>
<hr>
## rsqrt

```c
float rsqrt(float val)
```
<dl>
<dt>Описание</dt><dd>
Возвращает обратную величину квадратного корня значения (`1 / sqrt(val)`). Использует быстрый метод
John Carmackа.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| val | ценить |
</dd>
<dt>Возвращаемое значение</dt><dd>
Обратная величина квадратному корню значения.
</dd>
<dt>Смотрите также</dt><dd>
[pow], [sqrt]
</dd>
</dl>
<hr>
## clamp

```c
float clamp(float val, float minv, float maxv)
```
<dl>
<dt>Описание</dt><dd>
Фиксирует значение между пределами.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| val | ценить |
| minv | минимальное значение |
| maxv | максимальное значение |
</dd>
<dt>Возвращаемое значение</dt><dd>
Зажатое значение.
</dd>
<dt>Смотрите также</dt><dd>
[clampv2], [clampv3], [clampv4]
</dd>
</dl>
<hr>
## lerp

```c
float lerp(float a, float b, float t)
```
<dl>
<dt>Описание</dt><dd>
Линейный интерполирует два числа.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| a | первое плавающее число |
| b | второе плавающее число |
| t | значение интерполяции от 0.0 до 1.0 |
</dd>
<dt>Смотрите также</dt><dd>
[lerpv2], [lerpv3], [lerpv4], [lerpq], [slerpq]
</dd>
</dl>
<hr>
## pi

```c
float pi(void)
```
<dl>
<dt>Описание</dt><dd>
Возвращает π как число с плавающей запятой.
</dd>
<dt>Возвращаемое значение</dt><dd>
Значение 3.14159265358979323846.
</dd>
</dl>
<hr>
## cos

```c
float cos(uint16_t deg)
```
<dl>
<dt>Описание</dt><dd>
Возвращает косинус.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| deg | градусь, от 0 до 359, 0 вверху, 90 справа |
</dd>
<dt>Возвращаемое значение</dt><dd>
Косинус градуса, от -1.0 до 1.0.
</dd>
<dt>Смотрите также</dt><dd>
[sin], [tan], [acos], [asin], [atan], [atan2]
</dd>
</dl>
<hr>
## sin

```c
float sin(uint16_t deg)
```
<dl>
<dt>Описание</dt><dd>
Возвращает синус.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| deg | градусь, от 0 до 359, 0 вверху, 90 справа |
</dd>
<dt>Возвращаемое значение</dt><dd>
Синус градуса, от -1.0 до 1.0.
</dd>
<dt>Смотрите также</dt><dd>
[cos], [tan], [acos], [asin], [atan], [atan2]
</dd>
</dl>
<hr>
## tan

```c
float tan(uint16_t deg)
```
<dl>
<dt>Описание</dt><dd>
Возвращает танганс.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| deg | градусь, от 0 до 359, 0 вверху, 90 справа |
</dd>
<dt>Возвращаемое значение</dt><dd>
Тангенс градуса, от -1,0 до 1,0.
</dd>
<dt>Смотрите также</dt><dd>
[cos], [sin], [acos], [asin], [atan], [atan2]
</dd>
</dl>
<hr>
## acos

```c
uint16_t acos(float val)
```
<dl>
<dt>Описание</dt><dd>
Возвращает арккосинус.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| val | значение, от -1.0 до 1.0 |
</dd>
<dt>Возвращаемое значение</dt><dd>
Аркус-косинус в градусах от 0 до 359, 0 вверху, 90 вправо.
</dd>
<dt>Смотрите также</dt><dd>
[cos], [sin], [tan], [asin], [atan], [atan2]
</dd>
</dl>
<hr>
## asin

```c
uint16_t asin(float val)
```
<dl>
<dt>Описание</dt><dd>
Returns arcus sine.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| val | значение, от -1.0 до 1.0 |
</dd>
<dt>Возвращаемое значение</dt><dd>
Аркус синус в градусах от 0 до 359, 0 вверху, 90 вправо.
</dd>
<dt>Смотрите также</dt><dd>
[cos], [sin], [tan], [acos], [atan], [atan2]
</dd>
</dl>
<hr>
## atan

```c
uint16_t atan(float val)
```
<dl>
<dt>Описание</dt><dd>
Returns arcus tangent.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| val | значение, от -1.0 до 1.0 |
</dd>
<dt>Возвращаемое значение</dt><dd>
Тангенс дуги в градусах, от 0 до 359, 0 вверх, 90 вправо.
</dd>
<dt>Смотрите также</dt><dd>
[cos], [sin], [tan], [acos], [asin], [atan2]
</dd>
</dl>
<hr>
## atan2

```c
uint16_t atan2(float y, float x)
```
<dl>
<dt>Описание</dt><dd>
Возвращает тангенс дуги для y/x, используя знаки y и x для определения квадранта.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| y | координата Y |
| x | координата X |
</dd>
<dt>Возвращаемое значение</dt><dd>
Тангенс дуги в градусах, от 0 до 359, 0 вверх, 90 вправо.
</dd>
<dt>Смотрите также</dt><dd>
[cos], [sin], [tan], [acos], [asin]
</dd>
</dl>
<hr>
## dotv2

```c
float dotv2(addr_t a, addr_t b)
```
<dl>
<dt>Описание</dt><dd>
Вычисляет скалярное произведение двух векторов с двумя элементами.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| a | адрес двух поплавков |
| b | адрес двух поплавков |
</dd>
<dt>Возвращаемое значение</dt><dd>
Скалярное произведение векторов.
</dd>
<dt>Смотрите также</dt><dd>
[lenv2], [scalev2], [negv2], [addv2], [subv2], [mulv2], [divv2], [clampv2], [lerpv2], [normv2]
</dd>
</dl>
<hr>
## lenv2

```c
float lenv2(addr_t a)
```
<dl>
<dt>Описание</dt><dd>
Вычисляет длину вектора из двух элементов. Это медленно, старайтесь избегать (см. [normv2]).
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| a | адрес двух поплавков |
</dd>
<dt>Возвращаемое значение</dt><dd>
Длина вектора.
</dd>
<dt>Смотрите также</dt><dd>
[dotv2], [scalev2], [negv2], [addv2], [subv2], [mulv2], [divv2], [clampv2], [lerpv2], [normv2]
</dd>
</dl>
<hr>
## scalev2

```c
void scalev2(addr_t a, float s)
```
<dl>
<dt>Описание</dt><dd>
Масштабирует вектор с двумя элементами.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| a | адрес двух поплавков |
| s | значение масштабатора |
</dd>
<dt>Смотрите также</dt><dd>
[dotv2], [lenv2], [negv2], [addv2], [subv2], [mulv2], [divv2], [clampv2], [lerpv2], [normv2]
</dd>
</dl>
<hr>
## negv2

```c
void negv2(addr_t a)
```
<dl>
<dt>Описание</dt><dd>
Отменяет вектор с двумя элементами.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| a | адрес двух поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[dotv2], [lenv2], [scalev2], [addv2], [subv2], [mulv2], [divv2], [clampv2], [lerpv2], [normv2]
</dd>
</dl>
<hr>
## addv2

```c
void addv2(addr_t dst, addr_t a, addr_t b)
```
<dl>
<dt>Описание</dt><dd>
Складывает векторы с двумя элементами.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес двух поплавков, выход |
| a | адрес двух поплавков |
| b | адрес двух поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[dotv2], [lenv2], [scalev2], [negv2], [subv2], [mulv2], [divv2], [clampv2], [lerpv2], [normv2]
</dd>
</dl>
<hr>
## subv2

```c
void subv2(addr_t dst, addr_t a, addr_t b)
```
<dl>
<dt>Описание</dt><dd>
Вычитает векторы с двумя элементами.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес двух поплавков, выход |
| a | адрес двух поплавков |
| b | адрес двух поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[dotv2], [lenv2], [scalev2], [negv2], [addv2], [mulv2], [divv2], [clampv2], [lerpv2], [normv2]
</dd>
</dl>
<hr>
## mulv2

```c
void mulv2(addr_t dst, addr_t a, addr_t b)
```
<dl>
<dt>Описание</dt><dd>
Умножает векторы на два элемента.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес двух поплавков, выход |
| a | адрес двух поплавков |
| b | адрес двух поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[dotv2], [lenv2], [scalev2], [negv2], [addv2], [subv2], [divv2], [clampv2], [lerpv2], [normv2]
</dd>
</dl>
<hr>
## divv2

```c
void divv2(addr_t dst, addr_t a, addr_t b)
```
<dl>
<dt>Описание</dt><dd>
Делит векторы на два элемента.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес двух поплавков, выход |
| a | адрес двух поплавков |
| b | адрес двух поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[dotv2], [lenv2], [scalev2], [negv2], [addv2], [subv2], [mulv2], [clampv2], [lerpv2], [normv2]
</dd>
</dl>
<hr>
## clampv2

```c
void clampv2(addr_t dst, addr_t v, addr_t minv, addr_t maxv)
```
<dl>
<dt>Описание</dt><dd>
Зажимает векторы с двумя элементами.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес двух поплавков, выход |
| v | адрес двух поплавков, ввод |
| minv | адрес двух поплавков, минимум |
| maxv | адрес двух поплавков, максимум |
</dd>
<dt>Смотрите также</dt><dd>
[dotv2], [lenv2], [scalev2], [negv2], [addv2], [subv2], [mulv2], [divv2], [lerpv2], [normv2]
</dd>
</dl>
<hr>
## lerpv2

```c
void lerpv2(addr_t dst, addr_t a, addr_t b, float t)
```
<dl>
<dt>Описание</dt><dd>
Линейный интерполирует векторы с двумя элементами.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес двух поплавков, выход |
| a | адрес двух поплавков |
| b | адрес двух поплавков |
| t | значение интерполяции от 0.0 до 1.0 |
</dd>
<dt>Смотрите также</dt><dd>
[dotv2], [lenv2], [scalev2], [negv2], [addv2], [subv2], [mulv2], [divv2], [clampv2], [normv2]
</dd>
</dl>
<hr>
## normv2

```c
void normv2(addr_t a)
```
<dl>
<dt>Описание</dt><dd>
Нормализует вектор с двумя элементами.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| a | адрес двух поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[dotv2], [lenv2], [scalev2], [negv2], [addv2], [subv2], [mulv2], [divv2], [clampv2], [lerpv2]
</dd>
</dl>
<hr>
## dotv3

```c
float dotv3(addr_t a, addr_t b)
```
<dl>
<dt>Описание</dt><dd>
Вычисляет скалярное произведение двух векторов с тремя элементами.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| a | адрес трех поплавков |
| b | адрес трех поплавков |
</dd>
<dt>Возвращаемое значение</dt><dd>
Скалярное произведение векторов.
</dd>
<dt>Смотрите также</dt><dd>
[lenv3], [scalev3], [negv3], [addv3], [subv3], [mulv3], [divv3], [crossv3], [clampv3], [lerpv3], [normv3]
</dd>
</dl>
<hr>
## lenv3

```c
float lenv3(addr_t a)
```
<dl>
<dt>Описание</dt><dd>
Вычисляет длину вектора из трех элементов. Это медленно, старайтесь избегать (см. [normv3]).
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| a | адрес трех поплавков |
</dd>
<dt>Возвращаемое значение</dt><dd>
Длина вектора.
</dd>
<dt>Смотрите также</dt><dd>
[dotv3], [scalev3], [negv3], [addv3], [subv3], [mulv3], [divv3], [crossv3], [clampv3], [lerpv3], [normv3]
</dd>
</dl>
<hr>
## scalev3

```c
void scalev3(addr_t a, float s)
```
<dl>
<dt>Описание</dt><dd>
Масштабирует вектор с тремя элементами.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| a | адрес трех поплавков |
| s | значение масштабатора |
</dd>
<dt>Смотрите также</dt><dd>
[dotv3], [lenv3], [negv3], [addv3], [subv3], [mulv3], [divv3], [crossv3], [clampv3], [lerpv3], [normv3]
</dd>
</dl>
<hr>
## negv3

```c
void negv3(addr_t a)
```
<dl>
<dt>Описание</dt><dd>
Отменяет вектор с тремя элементами.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| a | адрес трех поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[dotv3], [lenv3], [scalev3], [addv3], [subv3], [mulv3], [divv3], [crossv3], [clampv3], [lerpv3], [normv3]
</dd>
</dl>
<hr>
## addv3

```c
void addv3(addr_t dst, addr_t a, addr_t b)
```
<dl>
<dt>Описание</dt><dd>
Складывает векторы с тремя элементами.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес трех поплавков, выход |
| a | адрес трех поплавков |
| b | адрес трех поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[dotv3], [lenv3], [scalev3], [negv3], [subv3], [mulv3], [divv3], [crossv3], [clampv3], [lerpv3], [normv3]
</dd>
</dl>
<hr>
## subv3

```c
void subv3(addr_t dst, addr_t a, addr_t b)
```
<dl>
<dt>Описание</dt><dd>
Вычитает векторы с тремя элементами.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес трех поплавков, выход |
| a | адрес трех поплавков |
| b | адрес трех поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[dotv3], [lenv3], [scalev3], [negv3], [addv3], [mulv3], [divv3], [crossv3], [clampv3], [lerpv3], [normv3]
</dd>
</dl>
<hr>
## mulv3

```c
void mulv3(addr_t dst, addr_t a, addr_t b)
```
<dl>
<dt>Описание</dt><dd>
Умножает векторы на три элемента.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес трех поплавков, выход |
| a | адрес трех поплавков |
| b | адрес трех поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[dotv3], [lenv3], [scalev3], [negv3], [addv3], [subv3], [divv3], [crossv3], [clampv3], [lerpv3], [normv3]
</dd>
</dl>
<hr>
## divv3

```c
void divv3(addr_t dst, addr_t a, addr_t b)
```
<dl>
<dt>Описание</dt><dd>
Делит векторы на три элемента.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес трех поплавков, выход |
| a | адрес трех поплавков |
| b | адрес трех поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[dotv3], [lenv3], [scalev3], [negv3], [addv3], [subv3], [mulv3], [crossv3], [clampv3], [lerpv3], [normv3]
</dd>
</dl>
<hr>
## crossv3

```c
void crossv3(addr_t dst, addr_t a, addr_t b)
```
<dl>
<dt>Описание</dt><dd>
Вычисляет векторное произведение векторов с тремя элементами.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес трех поплавков, выход |
| a | адрес трех поплавков |
| b | адрес трех поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[dotv3], [lenv3], [scalev3], [negv3], [addv3], [subv3], [mulv3], [divv3], [clampv3], [lerpv3], [normv3]
</dd>
</dl>
<hr>
## clampv3

```c
void clampv3(addr_t dst, addr_t v, addr_t minv, addr_t maxv)
```
<dl>
<dt>Описание</dt><dd>
Зажимает векторы с тремя элементами.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес трех поплавков, выход |
| v | адрес трех поплавков, ввод |
| minv | адрес трех поплавков, минимум |
| maxv | адрес трех поплавков, максимум |
</dd>
<dt>Смотрите также</dt><dd>
[dotv3], [lenv3], [scalev3], [negv3], [addv3], [subv3], [mulv3], [divv3], [crossv3], [lerpv3], [normv3]
</dd>
</dl>
<hr>
## lerpv3

```c
void lerpv3(addr_t dst, addr_t a, addr_t b, float t)
```
<dl>
<dt>Описание</dt><dd>
Линейный интерполирует векторы с тремя элементами.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес трех поплавков, выход |
| a | адрес трех поплавков |
| b | адрес трех поплавков |
| t | значение интерполяции от 0.0 до 1.0 |
</dd>
<dt>Смотрите также</dt><dd>
[dotv3], [lenv3], [scalev3], [negv3], [addv3], [subv3], [mulv3], [divv3], [crossv3], [clampv3], [normv3]
</dd>
</dl>
<hr>
## normv3

```c
void normv3(addr_t a)
```
<dl>
<dt>Описание</dt><dd>
Нормализует вектор с тремя элементами.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| a | адрес трех поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[dotv3], [lenv3], [scalev3], [negv3], [addv3], [subv3], [mulv3], [divv3], [crossv3], [clampv3], [lerpv3]
</dd>
</dl>
<hr>
## dotv4

```c
float dotv4(addr_t a, addr_t b)
```
<dl>
<dt>Описание</dt><dd>
Вычисляет скалярное произведение двух векторов с четырьмя элементами.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| a | адрес четырех поплавков |
| b | адрес четырех поплавков |
</dd>
<dt>Возвращаемое значение</dt><dd>
Скалярное произведение векторов.
</dd>
<dt>Смотрите также</dt><dd>
[lenv4], [scalev4], [negv4], [addv4], [subv4], [mulv4], [divv4], [clampv4], [lerpv4], [normv4]
</dd>
</dl>
<hr>
## lenv4

```c
float lenv4(addr_t a)
```
<dl>
<dt>Описание</dt><dd>
Вычисляет длину вектора из четырех элементов. Это медленно, старайтесь избегать (см. [normv4]).
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| a | адрес четырех поплавков |
</dd>
<dt>Возвращаемое значение</dt><dd>
Длина вектора.
</dd>
<dt>Смотрите также</dt><dd>
[dotv4], [scalev4], [negv4], [addv4], [subv4], [mulv4], [divv4], [clampv4], [lerpv4], [normv4]
</dd>
</dl>
<hr>
## scalev4

```c
void scalev4(addr_t a, float s)
```
<dl>
<dt>Описание</dt><dd>
Масштабирует вектор с четырьмя элементами.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| a | адрес четырех поплавков |
| s | значение масштабатора |
</dd>
<dt>Смотрите также</dt><dd>
[dotv4], [lenv4], [negv4], [addv4], [subv4], [mulv4], [divv4], [clampv4], [lerpv4], [normv4]
</dd>
</dl>
<hr>
## negv4

```c
void negv4(addr_t a)
```
<dl>
<dt>Описание</dt><dd>
Отменяет вектор с четырьмя элементами.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| a | адрес четырех поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[dotv4], [lenv4], [scalev4], [addv4], [subv4], [mulv4], [divv4], [clampv4], [lerpv4], [normv4]
</dd>
</dl>
<hr>
## addv4

```c
void addv4(addr_t dst, addr_t a, addr_t b)
```
<dl>
<dt>Описание</dt><dd>
Складывает векторы с четырьмя элементами.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес четырех поплавков, выход |
| a | адрес четырех поплавков |
| b | адрес четырех поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[dotv4], [lenv4], [negv4], [scalev4], [subv4], [mulv4], [divv4], [clampv4], [lerpv4], [normv4]
</dd>
</dl>
<hr>
## subv4

```c
void subv4(addr_t dst, addr_t a, addr_t b)
```
<dl>
<dt>Описание</dt><dd>
Вычитает векторы с четырьмя элементами.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес четырех поплавков, выход |
| a | адрес четырех поплавков |
| b | адрес четырех поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[dotv4], [lenv4], [scalev4], [negv4], [addv4], [mulv4], [divv4], [clampv4], [lerpv4], [normv4]
</dd>
</dl>
<hr>
## mulv4

```c
void mulv4(addr_t dst, addr_t a, addr_t b)
```
<dl>
<dt>Описание</dt><dd>
Умножает векторы на четыре элемента.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес четырех поплавков, выход |
| a | адрес четырех поплавков |
| b | адрес четырех поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[dotv4], [lenv4], [scalev4], [negv4], [addv4], [subv4], [divv4], [clampv4], [lerpv4], [normv4]
</dd>
</dl>
<hr>
## divv4

```c
void divv4(addr_t dst, addr_t a, addr_t b)
```
<dl>
<dt>Описание</dt><dd>
Делит векторы на четыре элемента.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес четырех поплавков, выход |
| a | адрес четырех поплавков |
| b | адрес четырех поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[dotv4], [lenv4], [scalev4], [negv4], [addv4], [subv4], [mulv4], [clampv4], [lerpv4], [normv4]
</dd>
</dl>
<hr>
## clampv4

```c
void clampv4(addr_t dst, addr_t v, addr_t minv, addr_t maxv)
```
<dl>
<dt>Описание</dt><dd>
Зажимает векторы с четырьмя элементами.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес четырех поплавков, выход |
| v | адрес четырех поплавков, ввод |
| minv | адрес четырех поплавков, минимум |
| maxv | адрес четырех поплавков, максимум |
</dd>
<dt>Смотрите также</dt><dd>
[dotv4], [lenv4], [scalev4], [negv4], [addv4], [subv4], [mulv4], [divv4], [lerpv4], [normv4]
</dd>
</dl>
<hr>
## lerpv4

```c
void lerpv4(addr_t dst, addr_t a, addr_t b, float t)
```
<dl>
<dt>Описание</dt><dd>
Линейный интерполирует векторы с четырьмя элементами.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес четырех поплавков, выход |
| a | адрес четырех поплавков |
| b | адрес четырех поплавков |
| t | значение интерполяции от 0.0 до 1.0 |
</dd>
<dt>Смотрите также</dt><dd>
[dotv4], [lenv4], [scalev4], [negv4], [addv4], [subv4], [mulv4], [divv4], [clampv4], [normv4]
</dd>
</dl>
<hr>
## normv4

```c
void normv4(addr_t a)
```
<dl>
<dt>Описание</dt><dd>
Нормализует вектор с четырьмя элементами.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| a | адрес четырех поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[dotv4], [lenv4], [scalev4], [negv4], [addv4], [subv4], [mulv4], [divv4], [clampv4], [lerpv4]
</dd>
</dl>
<hr>
## idq

```c
void idq(addr_t a)
```
<dl>
<dt>Описание</dt><dd>
Загружает идентификационный кватернион.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| a | адрес четырех поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[eulerq], [dotq], [lenq], [scaleq], [negq], [addq], [subq], [mulq], [rotq], [lerpq], [slerpq], [normq]
</dd>
</dl>
<hr>
## eulerq

```c
void eulerq(addr_t dst, uint16_t pitch, uint16_t yaw, uint16_t roll)
```
<dl>
<dt>Описание</dt><dd>
Загружает кватернион, используя углы Эйлера.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес четырех поплавков |
| pitch | вращение вокруг оси X в градусах, от 0 до 359 |
| yaw | вращение вокруг оси Y в градусах, от 0 до 359 |
| roll | вращение вокруг оси Z в градусах, от 0 до 359 |
</dd>
<dt>Смотрите также</dt><dd>
[idq], [dotq], [lenq], [scaleq], [negq], [addq], [subq], [mulq], [rotq], [lerpq], [slerpq], [normq]
</dd>
</dl>
<hr>
## dotq

```c
float dotq(addr_t a, addr_t b)
```
<dl>
<dt>Описание</dt><dd>
Вычисляет скалярное произведение кватерниона.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| a | адрес четырех поплавков |
| b | адрес четырех поплавков |
</dd>
<dt>Возвращаемое значение</dt><dd>
Скалярное произведение кватерниона.
</dd>
<dt>Смотрите также</dt><dd>
[idq], [eulerq], [lenq], [scaleq], [negq], [addq], [subq], [mulq], [rotq], [lerpq], [slerpq], [normq]
</dd>
</dl>
<hr>
## lenq

```c
float lenq(addr_t a)
```
<dl>
<dt>Описание</dt><dd>
Вычисляет длину кватерниона.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| a | адрес четырех поплавков |
</dd>
<dt>Возвращаемое значение</dt><dd>
Длина кватерниона.
</dd>
<dt>Смотрите также</dt><dd>
[idq], [eulerq], [dotq], [scaleq], [negq], [addq], [subq], [mulq], [rotq], [lerpq], [slerpq], [normq]
</dd>
</dl>
<hr>
## scaleq

```c
void scaleq(addr_t a, float s)
```
<dl>
<dt>Описание</dt><dd>
Масштабирует кватернион.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| a | адрес четырех поплавков |
| s | значение масштабатора |
</dd>
<dt>Смотрите также</dt><dd>
[idq], [eulerq], [dotq], [lenq], [negq], [addq], [subq], [mulq], [rotq], [lerpq], [slerpq], [normq]
</dd>
</dl>
<hr>
## negq

```c
void negq(addr_t a)
```
<dl>
<dt>Описание</dt><dd>
Отрицает кватернион.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| a | адрес четырех поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[idq], [eulerq], [dotq], [lenq], [scaleq], [addq], [subq], [mulq], [rotq], [lerpq], [slerpq], [normq]
</dd>
</dl>
<hr>
## addq

```c
void addq(addr_t dst, addr_t a, addr_t b)
```
<dl>
<dt>Описание</dt><dd>
Складывает кватернионы.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес четырех поплавков, выход |
| a | адрес четырех поплавков |
| b | адрес четырех поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[idq], [eulerq], [dotq], [lenq], [scaleq], [negq], [subq], [mulq], [rotq], [lerpq], [slerpq], [normq]
</dd>
</dl>
<hr>
## subq

```c
void subq(addr_t dst, addr_t a, addr_t b)
```
<dl>
<dt>Описание</dt><dd>
Вычитает кватернионы.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес четырех поплавков, выход |
| a | адрес четырех поплавков |
| b | адрес четырех поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[idq], [eulerq], [dotq], [lenq], [scaleq], [negq], [addq], [mulq], [rotq], [lerpq], [slerpq], [normq]
</dd>
</dl>
<hr>
## mulq

```c
void mulq(addr_t dst, addr_t a, addr_t b)
```
<dl>
<dt>Описание</dt><dd>
Умножает кватернионы.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес четырех поплавков, выход |
| a | адрес четырех поплавков |
| b | адрес четырех поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[idq], [eulerq], [dotq], [lenq], [scaleq], [negq], [addq], [subq], [rotq], [lerpq], [slerpq], [normq]
</dd>
</dl>
<hr>
## rotq

```c
void rotq(addr_t dst, addr_t q, addr_t v)
```
<dl>
<dt>Описание</dt><dd>
Вращает вектор с тремя элементами на кватернион.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес двух поплавков, выход |
| q | адрес четырех поплавков |
| v | адрес двух поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[idq], [eulerq], [dotq], [lenq], [scaleq], [negq], [addq], [subq], [mulq], [lerpq], [slerpq], [normq]
</dd>
</dl>
<hr>
## lerpq

```c
void lerpq(addr_t dst, addr_t a, addr_t b, float t)
```
<dl>
<dt>Описание</dt><dd>
Линейный интерполирует два кватерниона.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес четырех поплавков, выход |
| a | адрес четырех поплавков |
| b | адрес четырех поплавков |
| t | значение интерполяции от 0.0 до 1.0 |
</dd>
<dt>Смотрите также</dt><dd>
[idq], [eulerq], [dotq], [lenq], [scaleq], [negq], [addq], [subq], [mulq], [rotq], [slerpq], [normq]
</dd>
</dl>
<hr>
## slerpq

```c
void slerpq(addr_t dst, addr_t a, addr_t b, float t)
```
<dl>
<dt>Описание</dt><dd>
Сферический интерполирует кватернион.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес четырех поплавков, выход |
| a | адрес четырех поплавков |
| b | адрес четырех поплавков |
| t | значение интерполяции от 0.0 до 1.0 |
</dd>
<dt>Смотрите также</dt><dd>
[idq], [eulerq], [dotq], [lenq], [scaleq], [negq], [addq], [subq], [mulq], [rotq], [lerpq], [normq]
</dd>
</dl>
<hr>
## normq

```c
void normq(addr_t a)
```
<dl>
<dt>Описание</dt><dd>
Нормализует кватернион.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| a | адрес четырех поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[idq], [eulerq], [dotq], [lenq], [scaleq], [negq], [addq], [subq], [mulq], [rotq], [lerpq], [slerpq]
</dd>
</dl>
<hr>
## idm4

```c
void idm4(addr_t a)
```
<dl>
<dt>Описание</dt><dd>
Загружает единичную матрицу 4 x 4.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| a | адрес 16 поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[trsm4], [detm4], [addm4], [subm4], [mulm4], [mulm4v3], [mulm4v4], [invm4], [trpm4]
</dd>
</dl>
<hr>
## trsm4

```c
void trsm4(addr_t dst, addr_t t, addr_t r, addr_t s)
```
<dl>
<dt>Описание</dt><dd>
Создает матрицу 4 x 4 с перемещением, вращением и масштабированием.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес 16 поплавков, матрица назначения |
| t | адрес двух поплавков, вектор перевода |
| r | адрес четырех поплавков, кватернион вращения |
| s | адрес двух поплавков, вектор масштабирования |
</dd>
<dt>Смотрите также</dt><dd>
[idm4], [detm4], [addm4], [subm4], [mulm4], [mulm4v3], [mulm4v4], [invm4], [trpm4]
</dd>
</dl>
<hr>
## detm4

```c
float detm4(addr_t a)
```
<dl>
<dt>Описание</dt><dd>
Возвращает определитель матрицы.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| a | адрес 16 поплавков |
</dd>
<dt>Возвращаемое значение</dt><dd>
Определитель матрицы.
</dd>
<dt>Смотрите также</dt><dd>
[idm4], [trsm4], [addm4], [subm4], [mulm4], [mulm4v3], [mulm4v4], [invm4], [trpm4]
</dd>
</dl>
<hr>
## addm4

```c
void addm4(addr_t dst, addr_t a, addr_t b)
```
<dl>
<dt>Описание</dt><dd>
Складывает матрицы вместе.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес 16 поплавков, выход |
| a | адрес 16 поплавков |
| b | адрес 16 поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[idm4], [trsm4], [detm4], [subm4], [mulm4], [mulm4v3], [mulm4v4], [invm4], [trpm4]
</dd>
</dl>
<hr>
## subm4

```c
void subm4(addr_t dst, addr_t a, addr_t b)
```
<dl>
<dt>Описание</dt><dd>
Вычитает матрицы.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес 16 поплавков, выход |
| a | адрес 16 поплавков |
| b | адрес 16 поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[idm4], [trsm4], [detm4], [addm4], [mulm4], [mulm4v3], [mulm4v4], [invm4], [trpm4]
</dd>
</dl>
<hr>
## mulm4

```c
void mulm4(addr_t dst, addr_t a, addr_t b)
```
<dl>
<dt>Описание</dt><dd>
Умножает матрицы.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес 16 поплавков, выход |
| a | адрес 16 поплавков |
| b | адрес 16 поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[idm4], [trsm4], [detm4], [addm4], [subm4], [mulm4v3], [mulm4v4], [invm4], [trpm4]
</dd>
</dl>
<hr>
## mulm4v3

```c
void mulm4v3(addr_t dst, addr_t m, addr_t v)
```
<dl>
<dt>Описание</dt><dd>
Умножает вектор с тремя элементами на матрицу.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес двух поплавков, выход |
| m | адрес 16 поплавков |
| v | адрес двух поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[idm4], [trsm4], [detm4], [addm4], [subm4], [mulm4], [mulm4v4], [invm4], [trpm4]
</dd>
</dl>
<hr>
## mulm4v4

```c
void mulm4v4(addr_t dst, addr_t m, addr_t v)
```
<dl>
<dt>Описание</dt><dd>
Умножает вектор с четырьмя элементами на матрицу.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес четырех поплавков, выход |
| m | адрес 16 поплавков |
| v | адрес четырех поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[idm4], [trsm4], [detm4], [addm4], [subm4], [mulm4], [mulm4v3], [invm4], [trpm4]
</dd>
</dl>
<hr>
## invm4

```c
void invm4(addr_t dst, addr_t a)
```
<dl>
<dt>Описание</dt><dd>
Вычисляет обратную матрицу.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес 16 поплавков, выход |
| a | адрес 16 поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[idm4], [trsm4], [detm4], [addm4], [subm4], [mulm4], [mulm4v3], [mulm4v4], [trpm4]
</dd>
</dl>
<hr>
## trpm4

```c
void trpm4(addr_t dst, addr_t a)
```
<dl>
<dt>Описание</dt><dd>
Транспонировать матрицу.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес 16 поплавков, выход |
| a | адрес 16 поплавков |
</dd>
<dt>Смотрите также</dt><dd>
[idm4], [trsm4], [detm4], [addm4], [subm4], [mulm4], [mulm4v3], [mulm4v4], [invm4]
</dd>
</dl>
<hr>
## trns

```c
void trns(addr_t dst, addr_t src, uint8_t num,
    int16_t x, int16_t y, int16_t z,
    uint16_t pitch, uint16_t yaw, uint16_t roll,
    float scale)
```
<dl>
<dt>Описание</dt><dd>
Перевести облако вершин, оно же. поместите 3D-модель в [3D-пространстве].
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | массив вершин назначения, 3 x 2 байта каждый, X, Y, Z |
| src | массив исходных вершин, 3 x 2 байта каждый, X, Y, Z |
| num | количество троек координат вершин в массиве |
| x | координата мира X, от -32767 до 32767 |
| y | координата мира Y, от -32767 до 32767 |
| z | координата мира Z, от -32767 до 32767 |
| pitch | вращение вокруг оси X в градусах, от 0 до 359 |
| yaw | вращение вокруг оси Y в градусах, от 0 до 359 |
| roll | вращение вокруг оси Z в градусах, от 0 до 359 |
| scale | масштаб, используйте 1.0 чтобы сохранить исходный размер |
</dd>
<dt>Смотрите также</dt><dd>
[mesh]
</dd>
</dl>

# Память

## inb

```c
uint8_t inb(addr_t src)
```
<dl>
<dt>Описание</dt><dd>
Чтение одного байта (byte) из памяти.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| src | адрес, от 0x00000 до 0xBFFFF |
</dd>
<dt>Возвращаемое значение</dt><dd>
Возвращает значение по этому адресу.
</dd>
</dl>
<hr>
## inw

```c
uint16_t inw(addr_t src)
```
<dl>
<dt>Описание</dt><dd>
Чтение слова (word, два байта) по памяти.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| src | адрес, от 0x00000 до 0xBFFFE |
</dd>
<dt>Возвращаемое значение</dt><dd>
Возвращает значение по этому адресу.
</dd>
</dl>
<hr>
## ini

```c
uint32_t ini(addr_t src)
```
<dl>
<dt>Описание</dt><dd>
Считайте целое число (int, четыре байта) из памяти.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| src | адрес, от 0x00000 до 0xBFFFC |
</dd>
<dt>Возвращаемое значение</dt><dd>
Возвращает значение по этому адресу.
</dd>
</dl>
<hr>
## outb

```c
void outb(addr_t dst, uint8_t value)
```
<dl>
<dt>Описание</dt><dd>
Запишите один байт (byte) в память.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес, от 0x00000 до 0xBFFFF |
| value | значение для установки, от 0 до 255 |
</dd>
</dl>
<hr>
## outw

```c
void outw(addr_t dst, uint16_t value)
```
<dl>
<dt>Описание</dt><dd>
Запишите слово (word, два байта) в память.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес, от 0x00000 до 0xBFFFE |
| value | значение для установки, от 0 до 65535 |
</dd>
</dl>
<hr>
## outi

```c
void outi(addr_t dst, uint32_t value)
```
<dl>
<dt>Описание</dt><dd>
Запишите целое число (int, четыре байта) в память.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес, от 0x00000 до 0xBFFFC |
| value | значение для установки, от 0 до 4294967295 |
</dd>
</dl>
<hr>
## memsave

```c
int memsave(uint8_t overlay, addr_t src, uint32_t size)
```
<dl>
<dt>Описание</dt><dd>
Сохраняет область памяти для наложения.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| overlay | индекс наложения для записи, от 0 до 255 |
| src | смещение памяти для сохранения, от 0x00000 до 0xBFFFF |
| size | количество байтов для сохранения |
</dd>
<dt>Возвращаемое значение</dt><dd>
Возвращает 1 в случае успеха, 0 в случае ошибки.
</dd>
<dt>Смотрите также</dt><dd>
[memload]
</dd>
</dl>
<hr>
## memload

```c
int memload(addr_t dst, uint8_t overlay, uint32_t maxsize)
```
<dl>
<dt>Описание</dt><dd>
Загружает наложение в указанную область памяти.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | смещение памяти для сохранения, от 0x00000 до 0xBFFFF |
| overlay | индекс оверлея для чтения, от 0 до 255 |
| maxsize | максимальное количество байтов для записи |
</dd>
<dt>Возвращаемое значение</dt><dd>
Возвращает количество фактически загруженных байтов.
</dd>
<dt>Смотрите также</dt><dd>
[memsave]
</dd>
</dl>
<hr>
## memcpy

```c
void memcpy(addr_t dst, addr_t src, uint32_t len)
```
<dl>
<dt>Описание</dt><dd>
Копирование областей памяти.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес назначения, от 0x00000 до 0xBFFFF |
| src | исходный адрес, от 0x00000 до 0xBFFFF |
| len | количество байтов для копирования |
</dd>
</dl>
<hr>
## memset

```c
void memset(addr_t dst, uint8_t value, uint32_t len)
```
<dl>
<dt>Описание</dt><dd>
Установить область памяти на заданное значение.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес назначения, от 0x00000 до 0xBFFFF |
| value | значение для установки, от 0 до 255 |
| len | количество байтов для установки |
</dd>
</dl>
<hr>
## memcmp

```c
int memcmp(addr_t addr0, addr_t addr1, uint32_t len)
```
<dl>
<dt>Описание</dt><dd>
Сравните регионы памяти.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| addr0 | первый адрес, от 0x00000 до 0xBFFFF |
| addr1 | второй адрес, от 0x00000 до 0xBFFFF |
| len | количество байтов для сравнения |
</dd>
<dt>Возвращаемое значение</dt><dd>
Возвращает разницу, 0, если две области памяти совпадают.
</dd>
</dl>
<hr>
## deflate

```c
int deflate(addr_t dst, addr_t src, uint32_t len)
```
<dl>
<dt>Описание</dt><dd>
Сжать буфер с помощью RFC1950 deflate (zlib).
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес назначения, от 0x00000 до 0xBFFFF |
| src | исходный адрес, от 0x00000 до 0xBFFFF |
| len | количество байтов для сжатия |
</dd>
<dt>Возвращаемое значение</dt><dd>
0 или отрицательное в случае ошибки, в противном случае длина сжатого буфера и сжатых данных в dst.
</dd>
<dt>Смотрите также</dt><dd>
[inflate]
</dd>
</dl>
<hr>
## inflate

```c
int inflate(addr_t dst, addr_t src, uint32_t len)
```
<dl>
<dt>Описание</dt><dd>
Распакуйте буфер со сжатыми данными RFC1950 deflate (zlib).
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| dst | адрес назначения, от 0x00000 до 0xBFFFF |
| src | исходный адрес, от 0x00000 до 0xBFFFF |
| len | количество сжатых байтов |
</dd>
<dt>Возвращаемое значение</dt><dd>
0 или отрицательное в случае ошибки, в противном случае длина несжатого буфера и несжатых данных в dst.
</dd>
<dt>Смотрите также</dt><dd>
[deflate]
</dd>
</dl>
<hr>
## time

```c
float time(void)
```
<dl>
<dt>Описание</dt><dd>
Возвращает количество тактов с момента включения питания.
</dd>
<dt>Возвращаемое значение</dt><dd>
Прошедшее время в миллисекундах с момента включения питания.
</dd>
<dt>Смотрите также</dt><dd>
[now]
</dd>
</dl>
<hr>
## now

```c
uint32_t now(void)
```
<dl>
<dt>Описание</dt><dd>
Возвращает метку времени UNIX. Проверьте байт по смещению 0000C, чтобы увидеть, не переполнен ли он.
</dd>
<dt>Возвращаемое значение</dt><dd>
Время в секундах, прошедшее с полуночи 1 января 1970 года по среднему времени по Гринвичу.
</dd>
<dt>Смотрите также</dt><dd>
[time]
</dd>
</dl>
<hr>
## atoi

```c
int atoi(str_t src)
```
<dl>
<dt>Описание</dt><dd>
Преобразует десятичную строку ASCII в целое число.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| src | строковый адрес, от 0x00000 до 0xBFFFF |
</dd>
<dt>Возвращаемое значение</dt><dd>
Числовое значение строки.
</dd>
<dt>Смотрите также</dt><dd>
[itoa], [str], [val]
</dd>
</dl>
<hr>
## itoa

```c
str_t itoa(int value)
```
<dl>
<dt>Описание</dt><dd>
Преобразует целое число в десятичную строку ASCII.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| value | значение от -2147483648 до 2147483647 |
</dd>
<dt>Возвращаемое значение</dt><dd>
Преобразованная строка.
</dd>
<dt>Смотрите также</dt><dd>
[atoi], [str], [val]
</dd>
</dl>
<hr>
## val

```c
float val(str_t src)
```
<dl>
<dt>Описание</dt><dd>
Преобразует десятичную строку ASCII в число с плавающей запятой.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| src | строковый адрес, от 0x00000 до 0xBFFFF |
</dd>
<dt>Возвращаемое значение</dt><dd>
Числовое значение строки.
</dd>
<dt>Смотрите также</dt><dd>
[itoa], [atoi], [str]
</dd>
</dl>
<hr>
## str

```c
str_t str(float value)
```
<dl>
<dt>Описание</dt><dd>
Преобразует число с плавающей запятой в десятичную строку ASCII.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| value | значение |
</dd>
<dt>Возвращаемое значение</dt><dd>
Преобразованная строка.
</dd>
<dt>Смотрите также</dt><dd>
[atoi], [itoa], [val]
</dd>
</dl>
<hr>
## sprintf

```c
str_t sprintf(str_t fmt, ...)
```
<dl>
<dt>Описание</dt><dd>
Возвращает строку UTF-8 с нулевым завершением, созданную с использованием формата и аргументов.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| fmt | [Строка формата] |
| ... | необязательные аргументы |
</dd>
<dt>Возвращаемое значение</dt><dd>
Созданная строка.
</dd>
</dl>
<hr>
## strlen

```c
int strlen(str_t src)
```
<dl>
<dt>Описание</dt><dd>
Возвращает количество байтов в строке (без завершающего нуля).
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| src | строковый адрес, от 0x00000 до 0xBFFFF |
</dd>
<dt>Возвращаемое значение</dt><dd>
Количество байтов в строке.
</dd>
<dt>Смотрите также</dt><dd>
[mblen]
</dd>
</dl>
<hr>
## mblen

```c
int mblen(str_t src)
```
<dl>
<dt>Описание</dt><dd>
Возвращает количество многобайтовых символов UTF-8 в строке (без завершающего нуля).
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| src | строковый адрес, от 0x00000 до 0xBFFFF |
</dd>
<dt>Возвращаемое значение</dt><dd>
Количество символов в строке.
</dd>
<dt>Смотрите также</dt><dd>
[strlen]
</dd>
</dl>
<hr>
## malloc

```c
addr_t malloc(uint32_t size)
```
<dl>
<dt>Описание</dt><dd>
Динамически распределяет пользовательскую память.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| size | количество байтов, которые нужно выделить |
</dd>
<dt>Возвращаемое значение</dt><dd>
Адрес нового выделенного буфера или NULL в случае ошибки.
</dd>
<dt>Смотрите также</dt><dd>
[realloc], [free]
</dd>
</dl>
<hr>
## realloc

```c
addr_t realloc(addr_t addr, uint32_t size)
```
<dl>
<dt>Описание</dt><dd>
Измените размер ранее выделенного буфера.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| addr | адрес выделенного буфера |
| size | количество байтов для изменения размера |
</dd>
<dt>Возвращаемое значение</dt><dd>
Адрес нового выделенного буфера или NULL в случае ошибки.
</dd>
<dt>Смотрите также</dt><dd>
[malloc], [free]
</dd>
</dl>
<hr>
## free

```c
int free(addr_t addr)
```
<dl>
<dt>Описание</dt><dd>
Освобождает динамически выделяемую пользовательскую память.
</dd>
<dt>Параметры</dt><dd>
| Аргум. | Описание |
| addr | адрес выделенного буфера |
</dd>
<dt>Возвращаемое значение</dt><dd>
1 в случае успеха, 0 в случае ошибки.
</dd>
<dt>Смотрите также</dt><dd>
[malloc], [realloc]
</dd>
</dl>
