-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathtools.h
More file actions
159 lines (142 loc) · 6.38 KB
/
tools.h
File metadata and controls
159 lines (142 loc) · 6.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#pragma once
#include <stdint.h>
// #define ABS(x) ((x) < 0 ? -(x) : (x))
/**
* @brief Номера битов слова состояния процессора (ССП)
*/
enum PSW_BITS
{
PSW_C = 0, /**< Флаг переноса, устанавливается, если был перенос из старшего разряда (15-го при словных операциях и 7-го при байтовых) */
PSW_V, /**< Флаг арифметического переполнения, при сложении вычисляется как исключающее ИЛИ переносов из старшего и предстаршего разрядов */
PSW_Z, /**< Флаг равенства результата нулю, устанавливается, если все биты результата ([15:0] при словных операциях и [7:0] при байтовых) */
PSW_N, /**< Флаг знака результата, равен старшему разряду (15-му для словных операций и 7-му для байтовых) */
PSW_T, /**< Флаг ловушки пошаговой отладки. Установленный бит T вызывает программное исключение по вектору 014 */
PSW_I = 7, /**< Единичное значение бита I маскирует прерывания IRQ */
PSW_PA0, /**< Младший бит номера процессора в системе */
PSW_PA1, /**< Старший бит номера процессора в системе */
PSW_PSW10, /**< Модифицирует обработку исключения зависания шины, если данный бит ненулевой, то исключение зависания
* будет обрабатываться в пультовом режиме по вектору 160002 */
PSW_PSW11 /**< Модифицирует обработку исключения зависания шины, если данный бит ненулевой, то исключение зависания
* будет обрабатываться в пультовом режиме по вектору 160002, иначе обработка по вектору 0000048 без перехода в пультовой режим */
};
/**
* @brief Получает слово состояния процессора (ССП)
*/
static inline uint16_t get_PSW()
{
char rv;
asm volatile (
"mfps\n"
"mov r0, %0"
: "=r" (rv)
);
return rv;
}
/**
* @brief Устанавливает слово состояния процессора (ССП)
*/
static inline void set_PSW(uint16_t psw)
{
asm volatile (
"mov %0, r0\n\t"
"mtps\n"
: : "r" (psw)
);
}
/**
* @brief Обменивает местами байты в слове
*/
static inline uint16_t SWAB(uint16_t word)
{
asm volatile (
"swab %0\n\t"
: "=r" (word) : : "cc"
);
return word;
}
/**
* @brief Вызывает инструкцию HALT
*/
static inline void HALT(void)
{
asm volatile (
"halt\n\t"
);
}
/**
* @brief Вызывает инструкцию TRAP с заданным номером
*/
static inline void TRAP(const uint8_t trap_no)
{
asm volatile (
"trap %[trap_no]\n\t"
:
: [trap_no]"I"(trap_no)
);
}
/**
* @brief Очищает непрерывный блок памяти длиной words 16-битных слов нулями.
* Без вызова memset - компилируется в один короткий цикл (clr (r)+ / sob).
*
* @param ptr - указатель на начало блока
* @param words - количество слов (>= 1, ноль превратит цикл в 65536 итераций)
*/
static inline void clr_words(void *ptr, uint16_t words)
{
asm volatile (
"1:\n\t"
"clr (%[ptr])+\n\t"
"sob %[words], 1b\n"
: [ptr]"+r"(ptr), [words]"+r"(words)
:
: "cc", "memory"
);
}
/**
* @brief Возвращает абсолютное значение 16-битного целого
*
* @param x - 16-битное целок
*/
static inline uint16_t abs16(const int16_t x)
{
uint16_t rv;
asm volatile (
"tst %[x]\n\t"
"bge .l_pos%=\n\t"
"neg %[x]\n"
".l_pos%=:\n\t"
"mov %[x], %[rv]\n\t"
: [rv]"=r"(rv)
: [x]"r"(x)
: "cc"
);
return rv;
}
/**
* @brief Приостанавливает выполнение программы на заддное в параметре время.
*
* @param value - время в миллисекундах
*/
void delay_ms(uint16_t time);
/**
* @brief ГСЧ основанный на 16-битном Xorshift LFSR с максимальным периодом использующим триплет 7,9,13 от John Metcalf
*
* @return 16-битное псевдо-случайное число
*/
uint16_t rand();
/**
* @brief конвертирует значение числа указанной ширины в указанной системе счисления в строку
*
* @param value - численное значение, которое необходимо вывести
* @param base - основание системы счисления (2..36), например 2 - для двоичных, 8 - для восьмеричных и т.д.
* @param width - если не равно нулю, то число будет дополнено до указанной в этом параметре ширины указанным символом
* @param pad_char - символ, которым будет дополнено число слева до цказанной в параметре width ширины
* @param str - указатель на буфер, куда будет записана строка со значением числа
*
* @return - количество символов в строке со значением числа
*/
// uint8_t int_to_str(uint16_t value, uint8_t base, uint8_t width, char pad_char, char *str);
/**
* @brief Преобразует значение целого числа в строку в десятичной системе счисления
*/
void uint_to_str(uint16_t value, char **str);