<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dw="https://www.dreamwidth.org">
  <id>tag:dreamwidth.org,2016-12-30:2658815</id>
  <title>x86128</title>
  <subtitle>x86128</subtitle>
  <author>
    <name>x86128</name>
  </author>
  <link rel="alternate" type="text/html" href="https://x86128.dreamwidth.org/"/>
  <link rel="self" type="text/xml" href="https://x86128.dreamwidth.org/data/atom"/>
  <updated>2023-04-26T17:40:08Z</updated>
  <dw:journal username="x86128" type="personal"/>
  <entry>
    <id>tag:dreamwidth.org,2016-12-30:2658815:5022</id>
    <link rel="alternate" type="text/html" href="https://x86128.dreamwidth.org/5022.html"/>
    <link rel="self" type="text/xml" href="https://x86128.dreamwidth.org/data/atom/?itemid=5022"/>
    <title>Приехал китайский RP2040</title>
    <published>2023-04-26T17:40:08Z</published>
    <updated>2023-04-26T17:40:08Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">Ещё в начале апреля приехала ко мне китайская версия Raspberry Pi Pico:&lt;br /&gt;&lt;br /&gt;&lt;img src="https://x86128.dreamwidth.org/file/1314.jpg" alt="" title="" width="431" height="573" /&gt;&lt;br /&gt;&lt;br /&gt;Припаял не очень аккуратно :) всё-таки паяльник в руках держал ещё в школе и по роду деятельности, не приходилось с ним иметь дело.&lt;br /&gt;&lt;br /&gt;На борту платки имеется 16Мб флеш-памяти и RGB светодиод на базе WS2812B.&lt;br /&gt;&lt;br /&gt;&lt;span class="cut-wrapper"&gt;&lt;span style="display: none;" id="span-cuttag___1" class="cuttag"&gt;&lt;/span&gt;&lt;b class="cut-open"&gt;(&amp;nbsp;&lt;/b&gt;&lt;b class="cut-text"&gt;&lt;a href="https://x86128.dreamwidth.org/5022.html#cutid1"&gt;Read more...&lt;/a&gt;&lt;/b&gt;&lt;b class="cut-close"&gt;&amp;nbsp;)&lt;/b&gt;&lt;/span&gt;&lt;div style="display: none;" id="div-cuttag___1" aria-live="assertive"&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=5022" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2016-12-30:2658815:4611</id>
    <link rel="alternate" type="text/html" href="https://x86128.dreamwidth.org/4611.html"/>
    <link rel="self" type="text/xml" href="https://x86128.dreamwidth.org/data/atom/?itemid=4611"/>
    <title>Немножко юмора в ленту</title>
    <published>2023-04-26T10:09:50Z</published>
    <updated>2023-04-26T10:09:50Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>1</dw:reply-count>
    <content type="html">&lt;img width="600px" src="https://x86128.dreamwidth.org/file/407.jpg" alt="" title="transformer" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=4611" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2016-12-30:2658815:4364</id>
    <link rel="alternate" type="text/html" href="https://x86128.dreamwidth.org/4364.html"/>
    <link rel="self" type="text/xml" href="https://x86128.dreamwidth.org/data/atom/?itemid=4364"/>
    <title>Кодоген здорового человека</title>
    <published>2021-10-20T09:21:17Z</published>
    <updated>2021-10-20T09:21:17Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>2</dw:reply-count>
    <content type="html">Рассмотрим теперь простой алгоритм преобразования арифметических (или логических) выражений в машинный код БЭСМ-6.&lt;br /&gt;&lt;br /&gt;Допустим есть вот эта программа:&lt;br /&gt;&lt;pre&gt;
MODULE arith;

var
	a : integer;

begin
	a := 5  - 3 * 8 div 6;
	writeint(a);
	writeln
END arith.
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;После прохода парсера и построения промежуточного вида в кодах виртуальной машины имеем такой код:&lt;br /&gt;&lt;pre&gt;
 ('LABEL', 'arith_main'),
 ('ALLOC', 1),
Вычисление выражения (без оптимизации) 
('CLOAD', 0),
 ('CLOAD', 1),
 ('CLOAD', 2),
 ('BINOP', '*'),
 ('CLOAD', 3),
 ('BINOP', 'DIV'),
 ('BINOP', '-'),
Сохранение в переменную А
 ('VSTOR', -1, 'a'),

Загрузка на стэк значения А
 ('VLOAD', -1, 'a'),
 ('SYSCALL', 'writeint'),
 ('DEALLOC', 1),

 ('SYSCALL', 'writeln'),
 ('STOP', '12345'),

 ('LABEL', 'const_table'),
 ('WORD', 5),
 ('WORD', 3),
 ('WORD', 8),
 ('WORD', 6),
 ('WORD', 0),
 ('LABEL', 'locals_base'),
 ('LABEL', 'stack_base')]
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Суть алгоритма заключается в том, что мы рассматриваем аккумулятор как вершину стека, соотв. линейно просматриваем код первой машины и начинаем заменять команды манипуляции со стеком на команды манипуляции с аккумулятором.&lt;br /&gt;Загрузка значения на аккумулятор взводит флаг того что он занят.&lt;br /&gt;Если два раза подряд попалась команда загрузки на аккумулятор, мы выталкиваем значение в стэк БЭСМ-6. Если же за командой выталкивания следует арифметическая операция, то операция выталкивания заменяется на арифметическую команду БЭСМ с указанием адреса аргумента. Таким образом отбрасывание вершины стека сводится к сбросу флага занятости аккумулятора. Операции вызова процедуры при занятом аккумуляторе автоматически сбрасывают его значение в стэк.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
TEXT:
00000:        	VTM  	21    	,M1
00001:        	VTM  	21    	,M15
00002:        	VTM  	16    	,M2
00003:        	UJ   	4    	 

00004: arith_main UTM  	1     	,M15

Вычисление a := 5  - 3 * 8 div 6;
00005:        	XTA  	0     	,M2
00006:        	XTS  	1     	,M2
00007:        	A*X  	2     	,M2
00008:        	A/X  	3     	,M2
00009:        	X-A  	0     	,M15
Запись в А
00010:        	ATX  	-1    	,M1
Вызов процедуры. Аргумент на стэк (т.к. XTA -1, M1 соотв. предыдущей команде, она удаляется)
00011:        	ATX  	0     	,M15
00012:        	*77  	0    	 
Корректировка стэка после вызова
00013:        	UTM  	-1    	,M15
00014:        	*77  	2    	 
00015:        	STOP 	12345	 
Константы
00016:        	WORD 	5    	 
00017:        	WORD 	3    	 
00018:        	WORD 	8    	 
00019:        	WORD 	6    	 
00020:        	WORD 	0    	 

CONSTANT TABLE:
00000:    	5    	5
00001:    	3    	3
00002:    	8    	8
00003:    	6    	6

PROCEDURE TABLE
  arith_main: 4

1
STOP at PC=15 code=12345 ir=0
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Итого:&lt;br /&gt;&lt;pre&gt;
00005:        	XTA  	0     	,M2
00006:        	XTS  	1     	,M2
00007:        	A*X  	2     	,M2
00008:        	A/X  	3     	,M2
00009:        	X-A  	0     	,M15
&lt;/pre&gt;&lt;br /&gt;Против метода курильщика:&lt;br /&gt;&lt;pre&gt;
00005:       	XTA  	0     	,M2
00006:       	ATX  	0     	,M15
00007:       	XTA  	1     	,M2
00008:       	ATX  	0     	,M15
00009:       	XTA  	2     	,M2
00010:       	ATX  	0     	,M15
00011:       	XTA  	-2    	,M15
00012:       	A*X  	-1    	,M15
00013:       	ATX  	-2    	,M15
00014:       	UTM  	-1    	,M15
00015:       	XTA  	3     	,M2
00016:       	ATX  	0     	,M15
00017:       	XTA  	-2    	,M15
00018:       	A/X  	-1    	,M15
00019:       	ATX  	-2    	,M15
00020:       	UTM  	-1    	,M15
00021:       	XTA  	-2    	,M15
00022:       	A-X  	-1    	,M15
00023:       	ATX  	-2    	,M15
00024:       	UTM  	-1    	,M15
00025:       	XTA  	0     	,M15
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Как говорится, почувствуйте разницу 😅️&lt;br /&gt;&lt;br /&gt;Дальше необходимо разобраться со ссылочными VAR-аргументами доступ к которым осуществляется по адресу значения и починить вычисление константных выражений.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=4364" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2016-12-30:2658815:4100</id>
    <link rel="alternate" type="text/html" href="https://x86128.dreamwidth.org/4100.html"/>
    <link rel="self" type="text/xml" href="https://x86128.dreamwidth.org/data/atom/?itemid=4100"/>
    <title>Преобразования кода ВМ в код условной БЭСМ-6</title>
    <published>2021-10-19T09:30:15Z</published>
    <updated>2021-10-19T09:34:32Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">Продолжаю эксперименты со строительством компилятора.&lt;br /&gt;Реализовал преобразование кода виртуальной машины в код виртуальной целочисленной БЭСМ-6 методом “курильщика” так же известного как Poor Man’s codegen 😅️.&lt;br /&gt;&lt;br /&gt;В качестве программы для тестирования возьмем вычисление выражения:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
var
    a : integer;

begin
    a := 5  - 3 * 8 div 6;
    writeint(a);
    writeln
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;В обратной польской записи получается так:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;5 3 8 * 6 / - &amp;gt;a&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Преобразуется в такой код “первой” виртуальной машины:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
 ('CLOAD', 0),
 ('CLOAD', 1),
 ('CLOAD', 2),
 ('BINOP', '*'),
 ('CLOAD', 3),
 ('BINOP', 'DIV'),
 ('BINOP', '-'),
 ('VSTOR', -1, 'a'),
 ('VLOAD', -1, 'a'),
 ('SYSCALL', 'writeint'),
 ('DEALLOC', 1),
 ('SYSCALL', 'writeln'),
 ('STOP', '12345'),

Таблица констант:
 ('LABEL', 'const_table'),
 ('WORD', 5),
 ('WORD', 3),
 ('WORD', 8),
 ('WORD', 6),
 ('WORD', 0),
 ('LABEL', 'locals_base'),
 ('LABEL', 'stack_base')]

Место для локальной переменной a:
 ('WORD', 0),
 ('LABEL', 'locals_base'),
 ('LABEL', 'stack_base')]
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Метод курильщика заключается в том, что каждую команду первой машины мы преобразуем буквально в код БЭСМ без каких либо оптимизаций, будто выполняется условный эмулятор первой ВМ на процессоре БЭСМ.&lt;br /&gt;&lt;br /&gt;Пусть у нас регистр M1 указывает на последнюю локальную переменную текущего кадра + 1, регистр M2 - на начало блока констант, а М15 - на первый пустой элемент стека, который растет в сторону увеличения адресов.&lt;br /&gt;&lt;br /&gt;Работать метод будет тоже со стеком, но пока без учета архитектуры БЭСМ, где аккумулятор является вершиной стека, поэтому код генерируется такой:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
00005:           XTA      0         ,M2
00006:           ATX      0         ,M15
00007:           XTA      1         ,M2
00008:           ATX      0         ,M15
00009:           XTA      2         ,M2
00010:           ATX      0         ,M15
00011:           XTA      -2        ,M15
00012:           A*X      -1        ,M15
00013:           ATX      -2        ,M15
00014:           UTM      -1        ,M15
00015:           XTA      3         ,M2
00016:           ATX      0         ,M15
00017:           XTA      -2        ,M15
00018:           A/X      -1        ,M15
00019:           ATX      -2        ,M15
00020:           UTM      -1        ,M15
00021:           XTA      -2        ,M15
00022:           A-X      -1        ,M15
00023:           ATX      -2        ,M15
00024:           UTM      -1        ,M15
00025:           XTA      0         ,M15
Сохранение результата
00026:           ATX      -1        ,M1
Печать числа
00027:           XTA      -1        ,M1
00028:           ATX      0         ,M15
00029:           *77      0         
00030:           UTM      -1        ,M15
Печать перевода строки
00031:           *77      2         
00032:           STOP     12345     
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Вот такой вот глупый код, но при этом рабочий.&lt;br /&gt;&lt;br /&gt;Рассмотрим как это можно записать с учетом того что аккумулятор является вершиной стека:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
5 3 8 * 6 / - &amp;gt;a

XTA =5
XTS =3
A*X =8
A/X =6
X-A ,M15
ATX =a
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Как говорится, разница на лицо. Есть над чем поработать.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=4100" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2016-12-30:2658815:3991</id>
    <link rel="alternate" type="text/html" href="https://x86128.dreamwidth.org/3991.html"/>
    <link rel="self" type="text/xml" href="https://x86128.dreamwidth.org/data/atom/?itemid=3991"/>
    <title>Маху дал или как можно сравнивать целые числа на БЭСМ-6</title>
    <published>2021-10-15T15:20:31Z</published>
    <updated>2021-10-15T15:20:31Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">В построении интерпретатора-компилятора я продвинулся до момента когда необходимо преобразовать код виртуальной машины в код еще более близкий к железу, т.е. к МЭСМ-6.&lt;br /&gt;&lt;br /&gt;Процессор БЭСМ-6, в отличии от современных собратьев, имеет интересную особенность: отсутствие привычных команд ветвления анализирующих условия (флажки) по равенству/неравенству, больше или равно, меньше. Вместо этого каждая команда, которая затрагивает аккумулятор устанавливает режим “омега”, но основе которого формируется признак “омега” на основе значения которого выполняются команды условного перехода UZA и U1A (переход по нулю и 1-це значения “омега”).&lt;br /&gt;&lt;br /&gt;Признак “омега” формируется следующим образом:&lt;br /&gt;&lt;pre&gt;
switch (ω mode) {
	case additive: ω = (A[41] != 0); /* A &amp;lt; 0 */ break;
	case multiplicative: ω = (A[48] != 1); /* abs(A) &amp;lt; 0.5 */ break;
	case logical: ω = (A[48:1] != 0); /* A != 0 */ break;
	case 0: ω = 1;
}
&lt;/pre&gt;&lt;br /&gt;Соответственно, чтобы запрограммировать:&lt;br /&gt;&lt;pre&gt;
if (a &amp;lt; b) {
  …
} else {
 else_block
}
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Необходимо, закодировать  a &amp;lt; b так:&lt;br /&gt;&lt;pre&gt;
xta a,M1
a-x b,M1
uza else_block   ; u1a для a &amp;gt;= b
...
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Для a == b:&lt;br /&gt;&lt;pre&gt;
xta a, M1
aex b, M2
u1a else_block   ; uza для a != b
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Что как раз очевидно следовало из первого и третьего case.&lt;br /&gt;&lt;br /&gt;Но что делать с a &amp;lt;= b ?&lt;br /&gt;Первое что пришло в голову так это выполнить две проверки, сначала на равенство a == b, а потом a &amp;lt; b ведь для этого у нас есть готовые признаки “омега” … &lt;br /&gt;&lt;br /&gt;А нужно то было всего лишь применить школьную программу и переставить местами a и b. Маху дал :)&lt;br /&gt;&lt;br /&gt;Таким образом:&lt;br /&gt;&lt;br /&gt;Для b &amp;lt; a так:&lt;br /&gt;&lt;pre&gt;
xta b,M1
a-x a,M1
uza else_block   ; u1a для b &amp;gt;= a, что эквивалентно a &amp;lt;= b
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Но, как заметил Леонид, для удобства в БЭСМ-6 есть команда x-a (обратное вычитание), получим:&lt;br /&gt;&lt;br /&gt;Для a &amp;gt; b:&lt;br /&gt;&lt;pre&gt;
xta a,M1
x-a b,M1
uza else_block   ; u1a для a &amp;lt;= b
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Слишком уж наше поколение стало избалованное процессорами с большим количеством инструкций, когда стоит только подумать, а уже есть какая-нибудь VFMADDSUB213PS, с умными компиляторами к ним.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=3991" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2016-12-30:2658815:3745</id>
    <link rel="alternate" type="text/html" href="https://x86128.dreamwidth.org/3745.html"/>
    <link rel="self" type="text/xml" href="https://x86128.dreamwidth.org/data/atom/?itemid=3745"/>
    <title>Простой шаг оптимизатора по IR</title>
    <published>2021-10-14T10:38:33Z</published>
    <updated>2021-10-14T10:38:33Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>3</dw:reply-count>
    <content type="html">Сделал простейший шаг оптимизатора по промежуточному представлению, который сворачивает арифметические операции если они совершаются над константами в выражениях.&lt;br /&gt;&lt;br /&gt;Например:&lt;br /&gt;&lt;pre&gt;
CONST 10
CONST 5
BINOP +
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Свернется просто в&lt;br /&gt;&lt;pre&gt;
CONST 15
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=3745" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2016-12-30:2658815:3485</id>
    <link rel="alternate" type="text/html" href="https://x86128.dreamwidth.org/3485.html"/>
    <link rel="self" type="text/xml" href="https://x86128.dreamwidth.org/data/atom/?itemid=3485"/>
    <title>Выдача листинга</title>
    <published>2021-10-13T10:17:11Z</published>
    <updated>2021-10-13T10:18:33Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">Внёс мелкие исправления и добавил выдачу листинга помимо трассировки. Дальше буду смотреть в сторону принципов изложенных в книге дракона по компиляторам.&lt;br /&gt;&lt;br /&gt;Для примера:&lt;br /&gt;&lt;pre&gt;
module towers;

var
    n : integer;

procedure write2ln(x, y: integer);
begin
    writeint(x);
    writespace(1);
    writeint(y);
    writeln
end write2ln;

procedure hanoy(n, x, y, z: integer);
begin
    if n &amp;gt; 0 then
        hanoy(n-1, x, z, y);
        write2ln(x, y);
        hanoy(n-1, z, y, x)
    end

end hanoy;

begin
    n := 3;
    hanoy(n, 1, 2, 3)

end towers.
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Листинг выглядит так:&lt;br /&gt;&lt;pre&gt;
TEXT:
00000:    write2ln VLOAD            -2
00001:             SYSCALL    writeint
00002:             DEALLOC           1
00003:             CONST             1
00004:             SYSCALL  writespace
00005:             DEALLOC           1
00006:             VLOAD            -1
00007:             SYSCALL    writeint
00008:             DEALLOC           1
00009:             SYSCALL     writeln
00010:             RETURN             
00011:       hanoy VLOAD            -4
00012:             CONST             0
00013:             RELOP             &amp;gt;
00014:             BR_ZERO          L0
00015:             VLOAD            -4
00016:             CONST             1
00017:             BINOP             -
00018:             VLOAD            -3
00019:             VLOAD            -1
00020:             VLOAD            -2
00021:             CALL             11
00022:             DEALLOC           4
00023:             VLOAD            -3
00024:             VLOAD            -2
00025:             CALL              0
00026:             DEALLOC           2
00027:             VLOAD            -4
00028:             CONST             1
00029:             BINOP             -
00030:             VLOAD            -1
00031:             VLOAD            -2
00032:             VLOAD            -3
00033:             CALL             11
00034:             DEALLOC           4
00035:          L0 
00036:             RETURN             
00037: towers_main ALLOC             1
00038:             CONST             3
00039:             VSTOR            -1
00040:             VLOAD            -1
00041:             CONST             1
00042:             CONST             2
00043:             CONST             3
00044:             CALL             11
00045:             DEALLOC           4
00046:             STOP          12345

CONSTANT TABLE:

PROCEDURE TABLE
    write2ln: 0
       hanoy: 11
 towers_main: 37
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Результат работы:&lt;br /&gt;&lt;pre&gt;
1 2
1 3
2 3
1 2
3 1
3 2
1 2
STOP at 46, CYCLES=316, max stack size: 27
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=3485" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2016-12-30:2658815:3310</id>
    <link rel="alternate" type="text/html" href="https://x86128.dreamwidth.org/3310.html"/>
    <link rel="self" type="text/xml" href="https://x86128.dreamwidth.org/data/atom/?itemid=3310"/>
    <title>Пару слов о компиляторе-интерпретаторе</title>
    <published>2021-10-12T09:19:48Z</published>
    <updated>2021-10-13T03:53:04Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">Доброго времени!&lt;br /&gt;&lt;br /&gt;Продолжаю эксперименты с компиляторо-строением.&lt;br /&gt;&lt;br /&gt;Добавил возможность возвращать результаты работы процедуры через VAR-аргументы.&lt;br /&gt;&lt;br /&gt;Поэтому подобный код компилируется и работает:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
MODULE Samples;
const
    pass = 12345;
    fail = 54321;

var
    t : integer;

procedure gcd(a,b : integer; var res : integer);
begin
    while b &amp;gt; 0 do
        res := b;
        b := a mod b;
        a := res
    end
end gcd;

begin
    gcd(27+25*3-(10 div 5),15, t);
    if t = 5 then
        halt(pass)
    else
        halt(fail)
    end

END Samples.
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Передача аргументов осуществляется через стек, на котором формируется рабочая область (фрейм) куда записываются аргументы процедуры и внутренние локальные переменные.&lt;br /&gt;&lt;br /&gt;Схема такая:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
| old frame | arg0 | arg1 | v0 | v1 | v2 | old_bp | return address | free RAM cells |
|-----------+------+------+----+----+----+--------+----------------+----------------|
|           |      |      |    |    |    | ^ BP   |                | ^ SP           |
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Сделал я это для того, чтобы была возможность работы с рекурсией, но боком вышло то, что глобальные переменные по отношению к телу процедуры “дали прикурить” т.к. их адреса во время компиляции программы неизвестны (так же из-за возможности объявлять вложенные процедуры (своего рода замыкания)). Можно было ввести некоторый GP который бы показывал на локальные переменные вышестоящей области видимости, но тогда пришлось бы организовывать какой-то механизм многократной относительной адресации. Понятно, что эта задача решаема, но в книге по Оберону я пока не добрался до соотв. главы. Если запретить рекурсию, то задача размещения и адресации переменных становится тривиальной, т.к. все адреса можно вычислить прямо на этапе компиляции.&lt;br /&gt;&lt;br /&gt;Результатом работы компилятора является такой питонячий объект:&lt;br /&gt;&lt;pre&gt;
{'c_mem': [12345, 54321],
 'consts': {'fail': {'line': 4, 'offset': 1, 'val': 54321},
            'pass': {'line': 3, 'offset': 0, 'val': 12345}},
 'main': 'Samples_main',
 'name': 'Samples',
 'p_text': [('LABEL', 'L0'),
            ('VLOAD', -2, 'b'),
            ('CONST', 0),
            ('RELOP', '&amp;gt;'),
            ('BR_ZERO', 'L1'),
            ('VLOAD', -2, 'b'),
            ('RSTOR', -1, 'res'),
            ('VLOAD', -3, 'a'),
            ('VLOAD', -2, 'b'),
            ('BINOP', 'MOD'),
            ('VSTOR', -2, 'b'),
            ('RLOAD', -1, 'res'),
            ('VSTOR', -3, 'a'),
            ('BR', 'L0'),
            ('LABEL', 'L1'),
            ('RETURN', ''),
            ('ALLOC', 1),
            ('CONST', 27),
            ('CONST', 25),
            ('CONST', 3),
            ('BINOP', '*'),
            ('BINOP', '+'),
            ('CONST', 10),
            ('CONST', 5),
            ('BINOP', 'DIV'),
            ('BINOP', '-'),
            ('CONST', 15),
            ('ADR_LOAD', -1, 't'),
            ('CALL', 0, 'gcd'),
            ('DEALLOC', 3),
            ('VLOAD', -1, 't'),
            ('CONST', 5),
            ('RELOP', '='),
            ('BR_ZERO', 'L3'),
            ('CLOAD', 0, 'pass'),
            ('SYSCALL', 'halt'),
            ('DEALLOC', 1),
            ('BR', 'L3'),
            ('LABEL', 'L2'),
            ('CLOAD', 1, 'fail'),
            ('SYSCALL', 'halt'),
            ('DEALLOC', 1),
            ('LABEL', 'L3'),
            ('STOP', '12345')],
 'proc_tab': {'Samples_main': {'offset': 16},
              'gcd': {'arg_sz': 3,
                      'args': {'a': {'offset': 2,
                                     'typ': 'integer',
                                     'var': False},
                               'b': {'offset': 1,
                                     'typ': 'integer',
                                     'var': False},
                               'res': {'offset': 0,
                                       'typ': 'integer',
                                       'var': True}},
                      'consts': {},
                      'offset': 0,
                      'v_size': 0,
                      'vars': {}}},
 'v_size': 1,
 'vars': {'t': {'offset': 0, 'size': 1, 'typ': 'integer'}}}
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Интерес представляет поле p_text, в котором находится текст программы в виде инструкций для абстрактной виртуальной машины. Я выбрал одноадресное промежуточное представление чтобы быть ближе к инструкциям машины МЭСМ-6, третий аргумент у некоторых операций носит косметический характер и сохраняется для удобочитаемости человеком.&lt;br /&gt;&lt;br /&gt;Трассировка вычисления НОД для чисел 100 и 15:&lt;br /&gt;&lt;pre&gt;
OP=('ALLOC', 1) PC=16 BP=1 SP=1 D_MEM=[0]
OP=('CONST', 27) PC=17 BP=1 SP=2 D_MEM=[0, 27]
OP=('CONST', 25) PC=18 BP=1 SP=3 D_MEM=[0, 27, 25]
OP=('CONST', 3) PC=19 BP=1 SP=4 D_MEM=[0, 27, 25, 3]
OP=('BINOP', '*') PC=20 BP=1 SP=3 D_MEM=[0, 27, 75]
OP=('BINOP', '+') PC=21 BP=1 SP=2 D_MEM=[0, 102]
OP=('CONST', 10) PC=22 BP=1 SP=3 D_MEM=[0, 102, 10]
OP=('CONST', 5) PC=23 BP=1 SP=4 D_MEM=[0, 102, 10, 5]
OP=('BINOP', 'DIV') PC=24 BP=1 SP=3 D_MEM=[0, 102, 2]
OP=('BINOP', '-') PC=25 BP=1 SP=2 D_MEM=[0, 100]
OP=('CONST', 15) PC=26 BP=1 SP=3 D_MEM=[0, 100, 15]
OP=('ADR_LOAD', -1, 't') PC=27 BP=1 SP=4 D_MEM=[0, 100, 15, 0]
OP=('CALL', 0, 'gcd') PC=28 BP=4 SP=6 D_MEM=[0, 100, 15, 0, 1, 29]
OP=('LABEL', 'L0') PC=0 BP=4 SP=6 D_MEM=[0, 100, 15, 0, 1, 29]
OP=('VLOAD', -2, 'b') PC=1 BP=4 SP=7 D_MEM=[0, 100, 15, 0, 1, 29, 15]
OP=('CONST', 0) PC=2 BP=4 SP=8 D_MEM=[0, 100, 15, 0, 1, 29, 15, 0]
OP=('RELOP', '&amp;gt;') PC=3 BP=4 SP=7 D_MEM=[0, 100, 15, 0, 1, 29, True]
OP=('BR_ZERO', 'L1') PC=4 BP=4 SP=6 D_MEM=[0, 100, 15, 0, 1, 29]
OP=('VLOAD', -2, 'b') PC=5 BP=4 SP=7 D_MEM=[0, 100, 15, 0, 1, 29, 15]
OP=('RSTOR', -1, 'res') PC=6 BP=4 SP=6 D_MEM=[15, 100, 15, 0, 1, 29]
OP=('VLOAD', -3, 'a') PC=7 BP=4 SP=7 D_MEM=[15, 100, 15, 0, 1, 29, 100]
OP=('VLOAD', -2, 'b') PC=8 BP=4 SP=8 D_MEM=[15, 100, 15, 0, 1, 29, 100, 15]
OP=('BINOP', 'MOD') PC=9 BP=4 SP=7 D_MEM=[15, 100, 15, 0, 1, 29, 10]
OP=('VSTOR', -2, 'b') PC=10 BP=4 SP=6 D_MEM=[15, 100, 10, 0, 1, 29]
OP=('RLOAD', -1, 'res') PC=11 BP=4 SP=7 D_MEM=[15, 100, 10, 0, 1, 29, 15]
OP=('VSTOR', -3, 'a') PC=12 BP=4 SP=6 D_MEM=[15, 15, 10, 0, 1, 29]
OP=('BR', 'L0') PC=13 BP=4 SP=6 D_MEM=[15, 15, 10, 0, 1, 29]
OP=('LABEL', 'L0') PC=0 BP=4 SP=6 D_MEM=[15, 15, 10, 0, 1, 29]
OP=('VLOAD', -2, 'b') PC=1 BP=4 SP=7 D_MEM=[15, 15, 10, 0, 1, 29, 10]
OP=('CONST', 0) PC=2 BP=4 SP=8 D_MEM=[15, 15, 10, 0, 1, 29, 10, 0]
OP=('RELOP', '&amp;gt;') PC=3 BP=4 SP=7 D_MEM=[15, 15, 10, 0, 1, 29, True]
OP=('BR_ZERO', 'L1') PC=4 BP=4 SP=6 D_MEM=[15, 15, 10, 0, 1, 29]
OP=('VLOAD', -2, 'b') PC=5 BP=4 SP=7 D_MEM=[15, 15, 10, 0, 1, 29, 10]
OP=('RSTOR', -1, 'res') PC=6 BP=4 SP=6 D_MEM=[10, 15, 10, 0, 1, 29]
OP=('VLOAD', -3, 'a') PC=7 BP=4 SP=7 D_MEM=[10, 15, 10, 0, 1, 29, 15]
OP=('VLOAD', -2, 'b') PC=8 BP=4 SP=8 D_MEM=[10, 15, 10, 0, 1, 29, 15, 10]
OP=('BINOP', 'MOD') PC=9 BP=4 SP=7 D_MEM=[10, 15, 10, 0, 1, 29, 5]
OP=('VSTOR', -2, 'b') PC=10 BP=4 SP=6 D_MEM=[10, 15, 5, 0, 1, 29]
OP=('RLOAD', -1, 'res') PC=11 BP=4 SP=7 D_MEM=[10, 15, 5, 0, 1, 29, 10]
OP=('VSTOR', -3, 'a') PC=12 BP=4 SP=6 D_MEM=[10, 10, 5, 0, 1, 29]
OP=('BR', 'L0') PC=13 BP=4 SP=6 D_MEM=[10, 10, 5, 0, 1, 29]
OP=('LABEL', 'L0') PC=0 BP=4 SP=6 D_MEM=[10, 10, 5, 0, 1, 29]
OP=('VLOAD', -2, 'b') PC=1 BP=4 SP=7 D_MEM=[10, 10, 5, 0, 1, 29, 5]
OP=('CONST', 0) PC=2 BP=4 SP=8 D_MEM=[10, 10, 5, 0, 1, 29, 5, 0]
OP=('RELOP', '&amp;gt;') PC=3 BP=4 SP=7 D_MEM=[10, 10, 5, 0, 1, 29, True]
OP=('BR_ZERO', 'L1') PC=4 BP=4 SP=6 D_MEM=[10, 10, 5, 0, 1, 29]
OP=('VLOAD', -2, 'b') PC=5 BP=4 SP=7 D_MEM=[10, 10, 5, 0, 1, 29, 5]
OP=('RSTOR', -1, 'res') PC=6 BP=4 SP=6 D_MEM=[5, 10, 5, 0, 1, 29]
OP=('VLOAD', -3, 'a') PC=7 BP=4 SP=7 D_MEM=[5, 10, 5, 0, 1, 29, 10]
OP=('VLOAD', -2, 'b') PC=8 BP=4 SP=8 D_MEM=[5, 10, 5, 0, 1, 29, 10, 5]
OP=('BINOP', 'MOD') PC=9 BP=4 SP=7 D_MEM=[5, 10, 5, 0, 1, 29, 0]
OP=('VSTOR', -2, 'b') PC=10 BP=4 SP=6 D_MEM=[5, 10, 0, 0, 1, 29]
OP=('RLOAD', -1, 'res') PC=11 BP=4 SP=7 D_MEM=[5, 10, 0, 0, 1, 29, 5]
OP=('VSTOR', -3, 'a') PC=12 BP=4 SP=6 D_MEM=[5, 5, 0, 0, 1, 29]
OP=('BR', 'L0') PC=13 BP=4 SP=6 D_MEM=[5, 5, 0, 0, 1, 29]
OP=('LABEL', 'L0') PC=0 BP=4 SP=6 D_MEM=[5, 5, 0, 0, 1, 29]
OP=('VLOAD', -2, 'b') PC=1 BP=4 SP=7 D_MEM=[5, 5, 0, 0, 1, 29, 0]
OP=('CONST', 0) PC=2 BP=4 SP=8 D_MEM=[5, 5, 0, 0, 1, 29, 0, 0]
OP=('RELOP', '&amp;gt;') PC=3 BP=4 SP=7 D_MEM=[5, 5, 0, 0, 1, 29, False]
OP=('BR_ZERO', 'L1') PC=4 BP=4 SP=6 D_MEM=[5, 5, 0, 0, 1, 29]
OP=('LABEL', 'L1') PC=14 BP=4 SP=6 D_MEM=[5, 5, 0, 0, 1, 29]
OP=('RETURN', '') PC=15 BP=1 SP=4 D_MEM=[5, 5, 0, 0]
OP=('DEALLOC', 3) PC=29 BP=1 SP=1 D_MEM=[5]
OP=('VLOAD', -1, 't') PC=30 BP=1 SP=2 D_MEM=[5, 5]
OP=('CONST', 5) PC=31 BP=1 SP=3 D_MEM=[5, 5, 5]
OP=('RELOP', '=') PC=32 BP=1 SP=2 D_MEM=[5, True]
OP=('BR_ZERO', 'L3') PC=33 BP=1 SP=1 D_MEM=[5]
OP=('CLOAD', 0, 'pass') PC=34 BP=1 SP=2 D_MEM=[5, 12345]

Program halted with code: 12345
SUCCESS
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=3310" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2016-12-30:2658815:2844</id>
    <link rel="alternate" type="text/html" href="https://x86128.dreamwidth.org/2844.html"/>
    <link rel="self" type="text/xml" href="https://x86128.dreamwidth.org/data/atom/?itemid=2844"/>
    <title>Компилируем более сложный IF</title>
    <published>2021-10-04T07:32:38Z</published>
    <updated>2021-10-04T07:32:38Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">Теперь интерпретатор может переварить более сложный тест:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
MODULE Samples;
const
    pass = 12345;
    fail = 54321;

var t1 : integer;

procedure test1;
begin
    if t1 = 10 then
        t1 := 9
    elsif t1 &amp;lt; 0 then
        halt(fail)
    else
        halt(fail)
    end
end test1;

procedure test2;
begin
    if t1 = 10 then
        halt(fail)
    elsif t1 &amp;lt; 0 then
        halt(fail)
    else
        t1 := -1
    end
end test2;

procedure test3;
begin
    if t1 = 10 then
        halt(fail)
    elsif t1 &amp;lt; 0 then
        t1 := pass
    else
        halt(fail)
    end
end test3;

begin
    (* initializing test *)
    t1 := 10;

    (* do modifications of global var t1 *)
    test1;
    test2;
    test3;

    (* t1 must be pass *)
    halt(t1)

END Samples.
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Получаем на выходе:&lt;br /&gt;&lt;pre&gt;
{'decls': {'consts': {'fail': 54321, 'pass': 12345},
           'procs': {'test1': {'args': [],
                               'decls': {'consts': {}, 'procs': {}, 'vars': {}},
                               'text': [('LOAD', 't1'),
                                        ('CONST', 10),
                                        ('RELOP', '='),
                                        ('BR_ZERO', 'L0'),
                                        ('CONST', 9),
                                        ('STOR', 't1'),
                                        ('BR', 'L2'),
                                        ('LABEL', 'L0'),
                                        ('LOAD', 't1'),
                                        ('CONST', 0),
                                        ('RELOP', '&amp;lt;'),
                                        ('BR_ZERO', 'L1'),
                                        ('LOAD', 'fail'),
                                        ('CALL', 'halt'),
                                        ('BR', 'L2'),
                                        ('LABEL', 'L1'),
                                        ('LOAD', 'fail'),
                                        ('CALL', 'halt'),
                                        ('LABEL', 'L2')]},
                     'test2': {'args': [],
                               'decls': {'consts': {}, 'procs': {}, 'vars': {}},
                               'text': [('LOAD', 't1'),
                                        ('CONST', 10),
                                        ('RELOP', '='),
                                        ('BR_ZERO', 'L3'),
                                        ('LOAD', 'fail'),
                                        ('CALL', 'halt'),
                                        ('BR', 'L5'),
                                        ('LABEL', 'L3'),
                                        ('LOAD', 't1'),
                                        ('CONST', 0),
                                        ('RELOP', '&amp;lt;'),
                                        ('BR_ZERO', 'L4'),
                                        ('LOAD', 'fail'),
                                        ('CALL', 'halt'),
                                        ('BR', 'L5'),
                                        ('LABEL', 'L4'),
                                        ('CONST', 1),
                                        ('UNARY', '-'),
                                        ('STOR', 't1'),
                                        ('LABEL', 'L5')]},
                     'test3': {'args': [],
                               'decls': {'consts': {}, 'procs': {}, 'vars': {}},
                               'text': [('LOAD', 't1'),
                                        ('CONST', 10),
                                        ('RELOP', '='),
                                        ('BR_ZERO', 'L6'),
                                        ('LOAD', 'fail'),
                                        ('CALL', 'halt'),
                                        ('BR', 'L8'),
                                        ('LABEL', 'L6'),
                                        ('LOAD', 't1'),
                                        ('CONST', 0),
                                        ('RELOP', '&amp;lt;'),
                                        ('BR_ZERO', 'L7'),
                                        ('LOAD', 'pass'),
                                        ('STOR', 't1'),
                                        ('BR', 'L8'),
                                        ('LABEL', 'L7'),
                                        ('LOAD', 'fail'),
                                        ('CALL', 'halt'),
                                        ('LABEL', 'L8')]}},
           'vars': {'t1': (0, 'integer')}},
 'name': 'Samples',
 'text': [('CONST', 10),
          ('STOR', 't1'),
          ('CALL', 'test1'),
          ('CALL', 'test2'),
          ('CALL', 'test3'),
          ('LOAD', 't1'),
          ('CALL', 'halt'),
          ('STOP', '12345')]}
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;И результат работы:&lt;br /&gt;&lt;pre&gt;
Program halted with code: 12345
SUCCESS
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Заодно перелопатил на использование объектов вместо туплей чтобы избавиться от конструкций типа e[1][0][1] в пользу st.then_block&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=2844" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2016-12-30:2658815:2731</id>
    <link rel="alternate" type="text/html" href="https://x86128.dreamwidth.org/2731.html"/>
    <link rel="self" type="text/xml" href="https://x86128.dreamwidth.org/data/atom/?itemid=2731"/>
    <title>Компиляция оператора IF</title>
    <published>2021-10-01T05:04:14Z</published>
    <updated>2021-10-01T05:04:14Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>2</dw:reply-count>
    <content type="html">Добавил компиляцию оператора IF.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
MODULE Samples;
var t1 : integer;

begin

    t1 := 10;
    if t1 = 10 then
        writeint(10)
    elsif t1 &amp;lt; 0 then
        writeint(-5)
    else
        writeint(44)
    end

END Samples.
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
MODULE Samples
{'decls': {'consts': {}, 'procs': {}, 'vars': {'t1': (0, 'integer')}},
 'name': 'Samples',
 'text': [('CONST', '10'),
          ('STOR', 't1'),
          ('LOAD', 't1'),
          ('CONST', '10'),
          ('RELOP', '='),
          ('BR_ZERO', 'L0'),
          ('CONST', '10'),
          ('CALL', 'writeint'),
          ('BR', 'L3'),
          ('LABEL', 'L0'),
          ('LOAD', 't1'),
          ('CONST', '0'),
          ('RELOP', '&amp;lt;'),
          ('BR_ZERO', 'L1'),
          ('CONST', '5'),
          ('UNARY', '-'),
          ('CALL', 'writeint'),
          ('BR', 'L3'),
          ('LABEL', 'L1'),
          ('CONST', '44'),
          ('CALL', 'writeint'),
          ('LABEL', 'L3'),
          ('STOP', '')]}
10
STOP at 22
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=2731" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2016-12-30:2658815:2403</id>
    <link rel="alternate" type="text/html" href="https://x86128.dreamwidth.org/2403.html"/>
    <link rel="self" type="text/xml" href="https://x86128.dreamwidth.org/data/atom/?itemid=2403"/>
    <title>Изготовление небольшого компилятора-интерпретатора</title>
    <published>2021-09-30T10:13:45Z</published>
    <updated>2021-09-30T10:13:45Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">В качестве эксперимента затеял сделать минимально возможный компилятор языка похожего на Oberon. Так сказать пощупать руками компиляторостроение.&lt;br /&gt;&lt;br /&gt;Почитал по диагонали профильную литературу, но рукам, конечно, не терпится сразу приступить к делу :).&lt;br /&gt;&lt;br /&gt;Сегодня заработал самый минимально живущий интерпретатор-компилятор, который я изготовил на Python.&lt;br /&gt;&lt;br /&gt;Поскольку код крайне сырой, планирую несколько итераций по причёсыванию кода (замена туплей на объекты и т.д.) чтобы привести его в более идеоматический Python.&lt;br /&gt;&lt;br /&gt;Пока нет оператора IF, циклов кроме WHILE, поддержки массивов (поэтому и строк), составных типов, только целые типы - только хардкор. Так же нет тестов.&lt;br /&gt;&lt;br /&gt;Парсер LL(1) грамматики, на основе входного потока токенов от лексера, строит подобие синтаксического дерева. Далее "дерево" обходится компилятором который строит код для абстрактной стековой машины. Далее виртуальная машина выполняет код используя стек данных и стек фреймов (куда напресовываются рабочие области процедур (locals)).&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
MODULE Samples;

procedure gcd(a,b : integer);
    var t : integer;
begin
    while b &amp;gt; 0 do
        t := b;
        b := a mod b;
        a := t
    end;

    writeint(a)
end gcd;

begin
    gcd(27+25*3-(10 div 5),15)

END Samples.
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;На выходе имеем готовое к употреблению интерпретатором:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
MODULE Samples
{'decls': {'consts': {},
           'procs': {'gcd': {'args': [('a', 'integer'), ('b', 'integer')],
                             'decls': {'consts': {},
                                       'procs': {},
                                       'vars': {'a': (0, 'integer'),
                                                'b': (0, 'integer'),
                                                't': (0, 'integer')}},
                             'text': [('STOR', 'b'),
                                      ('STOR', 'a'),
                                      ('LABEL', 'L0'),
                                      ('LOAD', 'b'),
                                      ('CONST', '0'),
                                      ('RELOP', '&amp;gt;'),
                                      ('BR_ZERO', 'L1'),
                                      ('LOAD', 'b'),
                                      ('STOR', 't'),
                                      ('LOAD', 'a'),
                                      ('LOAD', 'b'),
                                      ('BINOP', 'mod'),
                                      ('STOR', 'b'),
                                      ('LOAD', 't'),
                                      ('STOR', 'a'),
                                      ('BR', 'L0'),
                                      ('LABEL', 'L1'),
                                      ('LOAD', 'a'),
                                      ('CALL', 'writeint')]}},
           'vars': {}},
 'name': 'Samples',
 'text': [('CONST', '27'),
          ('CONST', '25'),
          ('CONST', '3'),
          ('BINOP', '*'),
          ('BINOP', '+'),
          ('CONST', '10'),
          ('CONST', '5'),
          ('BINOP', 'div'),
          ('BINOP', '-'),
          ('CONST', '15'),
          ('CALL', 'gcd'),
          ('STOP', '')]}
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Что в результате дает:&lt;br /&gt;&lt;pre&gt;
5
STOP at 11
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=2403" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2016-12-30:2658815:2247</id>
    <link rel="alternate" type="text/html" href="https://x86128.dreamwidth.org/2247.html"/>
    <link rel="self" type="text/xml" href="https://x86128.dreamwidth.org/data/atom/?itemid=2247"/>
    <title>Полезная утилитка: qrencode</title>
    <published>2021-07-12T07:09:31Z</published>
    <updated>2021-07-12T07:09:31Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>1</dw:reply-count>
    <content type="html">Обнаружилась полезная утилитка &lt;code&gt;qrencode&lt;/code&gt; для генерирования QR-кодов прям из консоли linux:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;qrencode -t ansiutf8 'Hello, world!!!'&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://imgur.com/iRD7n8F"&gt;&lt;img src="https://i.imgur.com/iRD7n8F.png" title="source: imgur.com" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Таким образом сейчас можно в некоторые программы переносить начальные настройки, например, настройки туннелей в wireguard (или nextcloud), а сам код отправить почтой домашним или родственникам чтобы они щелкнули смартфоном, кому настраивать собственную VPS-ку может быть сложно.&lt;br /&gt;&lt;br /&gt;В дополнение к посту &lt;a href="https://x86128.dreamwidth.org/1575.html"&gt;https://x86128.dreamwidth.org/1575.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=2247" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2016-12-30:2658815:1895</id>
    <link rel="alternate" type="text/html" href="https://x86128.dreamwidth.org/1895.html"/>
    <link rel="self" type="text/xml" href="https://x86128.dreamwidth.org/data/atom/?itemid=1895"/>
    <title>Баловство на Python</title>
    <published>2021-04-30T15:43:28Z</published>
    <updated>2021-04-30T15:43:28Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>4</dw:reply-count>
    <content type="html">В качестве небольшого pet-project состряпал на Python клон МЭСМ-6 и ассемблера к ней.&lt;br /&gt;&lt;br /&gt;Машина проходит основные тесты от МЭСМ-6. В папке examples лежат не столько примеры кода на ассемблере, сколько недо тесты ассемблера. По сути рабочий там hello.asm который печатает в stdout &amp;quot;&lt;em&gt;hello, world!!!&lt;/em&gt;&amp;quot;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# hello world using loop&lt;br /&gt;org     1&lt;br /&gt;ptr     prn0    32767&lt;br /&gt;&lt;br /&gt;# loop setup&lt;br /&gt;        vtm     -15,2&lt;br /&gt;lbl     loop&lt;br /&gt;        xta     hello+15,2&lt;br /&gt;        atx     prn0&lt;br /&gt;        vlm     loop,2&lt;br /&gt;        stop    0o12345,6&lt;br /&gt;dorg    0o2000&lt;br /&gt;arr     hello &amp;quot;Hello, world!!!\n&amp;quot;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Скомпилировать его можно так: &lt;pre&gt;&lt;br /&gt;python3 asm/asm.py -i examples/hello.asm&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;и запустить: &lt;pre&gt;&lt;br /&gt;python3 pymesm.py -i examples/hello.oct&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Hello, world!!!&lt;br /&gt;CPU halted at 00003 with 12345&lt;br /&gt;Success&lt;br /&gt;Simulation finished.&lt;br /&gt;&lt;/pre&gt;Остальные тесты лежат в папке test/&lt;br /&gt;&lt;br /&gt;Код реализации МЭСМ местами умышленно кучерявый :))))))))), например:&lt;br /&gt;&lt;br /&gt;popcount(x) = bin(x).count(&amp;quot;1&amp;quot;) # раз Python то почему бы и нет!&lt;br /&gt;&lt;br /&gt;Синтаксис ассемблера отличается от общепринятых.&lt;br /&gt;Делал с ручной токенизацией по принципу &amp;quot;&lt;strong&gt;команда&lt;/strong&gt; &lt;em&gt;аргумент&amp;quot;  &lt;/em&gt;для&lt;em&gt; &lt;/em&gt;того чтобы  понимать на практике во что превращается LL(1) грамматика принятая в языках типа Pascal или Go.&lt;br /&gt;Хотел прикинуть сложность возможной реализации языка Оберон для МЭСМ.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://github.com/x86128/pymesm"&gt;https://github.com/x86128/pymesm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br type="_moz" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=1895" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2016-12-30:2658815:1575</id>
    <link rel="alternate" type="text/html" href="https://x86128.dreamwidth.org/1575.html"/>
    <link rel="self" type="text/xml" href="https://x86128.dreamwidth.org/data/atom/?itemid=1575"/>
    <title>Борьба с весенним обострением</title>
    <published>2021-04-04T06:30:53Z</published>
    <updated>2023-04-03T08:36:16Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>1</dw:reply-count>
    <content type="html">Доброго дня!&lt;br /&gt;&lt;br /&gt;В целях борьбы с разного рода замедлением и блокировкой от известного министерства, народ состряпал простой гайд: https://www.cyberciti.biz/faq/ubuntu-20-04-set-up-wireguard-vpn-server/&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Начиная с Ubuntu 22.04 шаг №11 обязателен&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Краткий пересказ&lt;br /&gt;&lt;br /&gt;1. Берем обычную VPS-ку с Ubuntu 20.04&lt;br /&gt;2. Обновляем систему и ставим пакеты&lt;br /&gt;&lt;code&gt;&lt;br /&gt;apt update&lt;br /&gt;apt upgrade&lt;br /&gt;apt install wireguard&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;3. делаем ключи для сервера&lt;br /&gt;&lt;code&gt;&lt;br /&gt;umask 077; wg genkey | tee privatekey | wg pubkey &amp;gt; publickey&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;получили два файлика &lt;b&gt;privatekey&lt;/b&gt; и &lt;b&gt;publickey&lt;/b&gt; назначение которых понятно из названия&lt;br /&gt;&lt;br /&gt;4. аналогичным образом делаем ключи для клиента (в другой папке или с другими именами, это не важно, т.к. далее понадобится только содержимое)&lt;br /&gt;&lt;br /&gt;5. командой &lt;strong&gt;ip a&lt;/strong&gt; смотрим как называется интерфейс с Интернетом и запоминаем адрес (в моем случае это &lt;strong&gt;eth0&lt;/strong&gt;, у вас может быть &lt;strong&gt;enps&lt;/strong&gt;).&lt;br /&gt;&lt;br /&gt;6. создаем файл &lt;strong&gt;/etc/wireguard/wg0.conf&lt;/strong&gt; с настройками сервера&lt;br /&gt;&lt;code&gt;&lt;br /&gt;[Interface]&lt;br /&gt;## внутренний адрес сервера ##&lt;br /&gt;Address = 192.168.6.1/24&lt;br /&gt;## Правила для iptables чтобы пошел NAT&lt;br /&gt;PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE&lt;br /&gt;PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE&lt;br /&gt;## номер порта сервера на который подключаются клиенты&lt;br /&gt;ListenPort = 41194&lt;br /&gt; &lt;br /&gt;## частный ключ сервера (privatekey) ##&lt;br /&gt;PrivateKey = iNsdfgjsdkfjgsdjflgjsdlfkjgnitYWwJHEs=&lt;br /&gt;&lt;br /&gt;[Peer]&lt;br /&gt;## публичный ключ клиента (содержимое publickey клиента)&lt;br /&gt;PublicKey = sEhgpzgsdfsdfsdfJIsdfsdfV1PxHi7OC3Dk=&lt;br /&gt;## внутренний адрес клиента&lt;br /&gt;AllowedIPs = 192.168.6.3/32&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Секций peer может быть несколько с разными публичными ключами клиентов&lt;br /&gt;&lt;br /&gt;7. стартуем wireguard на сервере и добавляем его в автозапуск&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sudo systemctl enable wg-quick@wg0&lt;br /&gt;sudo systemctl start wg-quick@wg0&lt;br /&gt;sudo systemctl status wg-quick@wg0&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;8. делаем конфиг для клиента&lt;br /&gt;&lt;code&gt;&lt;br /&gt;[Interface]&lt;br /&gt;## Частный ключ клиента (содержимое privatekey) ##&lt;br /&gt;PrivateKey = EsdfgjksdlfkhlsdfgsdfsbvcxbxcvbxcvbxcvbxcvbA=&lt;br /&gt;&lt;br /&gt;## Внутренний адрес клиента ##&lt;br /&gt;Address = 192.168.6.3/24&lt;br /&gt; DNS = 8.8.8.8&lt;br /&gt;&lt;br /&gt;[Peer]&lt;br /&gt;## публичный ключ сервера ##&lt;br /&gt;PublicKey = vDmsdfgsdfgsdfgsdfgsdfgsdfgsdfgFqeCM=&lt;br /&gt; &lt;br /&gt;## Чтобы в VPN уходил весь трафик ##&lt;br /&gt;AllowedIPs = 0.0.0.0/0&lt;br /&gt; &lt;br /&gt;## Вместо X.X.X.X ставьте адрес вашего VPS сервера ##&lt;br /&gt;Endpoint = X.X.X.X:41194&lt;br /&gt; &lt;br /&gt;##  Key connection alive ##&lt;br /&gt;PersistentKeepalive = 15&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;9. конфиг клиента подкладываем на десктоп или отправляем почтой на телефон&lt;br /&gt;в приложении достаточно выполнить импорт этого файла и всё сразу работает&lt;br /&gt;Например, генерируем qr код прямо из консоли&amp;nbsp;&lt;pre&gt;
qrencode -t ansiutf8 &amp;lt; wg.conf&lt;/pre&gt;и сканируем в приложении wireguard&lt;br /&gt;&lt;br /&gt;10. приложение на Andriod позволяет выбрать какие приложения отправлять в VPN - это очень удобно, чтобы например youtube не отжирал трафик и процессор телефона.&lt;br /&gt;&lt;br /&gt;11. на всякий случай можно проверить что работает маршрутизация&lt;br /&gt;В файлах &lt;strong&gt;/etc/sysctl.conf&lt;/strong&gt; или &lt;strong&gt;/etc/ufw/sysctl.conf&lt;/strong&gt; должна быть не закоменченная строчка строчка&amp;nbsp;&lt;strong&gt;net.ipv4.ip_forward=1&lt;/strong&gt;&lt;br /&gt;&lt;br type="_moz" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=1575" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2016-12-30:2658815:1463</id>
    <link rel="alternate" type="text/html" href="https://x86128.dreamwidth.org/1463.html"/>
    <link rel="self" type="text/xml" href="https://x86128.dreamwidth.org/data/atom/?itemid=1463"/>
    <title>Загрузка с виниловой пластинки? А почему бы и нет.</title>
    <published>2020-12-10T07:53:27Z</published>
    <updated>2020-12-10T07:53:27Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">Ссылка на оригинальную статью от автора: &lt;a href="http://boginjr.com/it/sw/dev/vinyl-boot/"&gt;http://boginjr.com/it/sw/dev/vinyl-boot/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe width="1280" height="720" src="https://www.youtube.com/embed/bqz65_YfcJg" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=1463" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2016-12-30:2658815:1156</id>
    <link rel="alternate" type="text/html" href="https://x86128.dreamwidth.org/1156.html"/>
    <link rel="self" type="text/xml" href="https://x86128.dreamwidth.org/data/atom/?itemid=1156"/>
    <title>Сложные системы не без граблей</title>
    <published>2019-05-11T17:13:48Z</published>
    <updated>2019-05-11T17:13:48Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>6</dw:reply-count>
    <content type="html">Продолжаю осваивать Quartus.&lt;br /&gt;&lt;br /&gt;Для работы с внутренней флешкой MAX10 напрямую, решил собрать SoC с процессором Nios2.&lt;br /&gt;&lt;br /&gt;Собирая Hello World с Nios2 вылазили, по-мелочи, всякие странные ошибки типа таких:&lt;br /&gt;&lt;img src="https://i.imgur.com/ry4tT94l.png" /&gt;&lt;br /&gt;&lt;br /&gt;Хотя я и не просил:&lt;br /&gt;&lt;img src="https://i.imgur.com/HfBqaCtl.png" /&gt;&lt;br /&gt;&lt;br /&gt;Заглядываем в мастер систем:&lt;br /&gt;&lt;img src="https://i.imgur.com/kvFI1T1l.png" /&gt;&lt;br /&gt;&lt;br /&gt;Глобальные настройки тоже все в порядке, везде галочки выключены.&lt;br /&gt;&lt;br /&gt;Смотрим в отчет:&lt;br /&gt;&lt;br /&gt;&lt;img src="https://i.imgur.com/l3TXgIRl.png" /&gt;&lt;br /&gt;&lt;br /&gt;Сохраняем проект. В дизайнере платформы ставим снимаем галочки на преинициализации памяти, сохраняем и перегенерируем скрипты. Закрываем квартус. Открываем собираем проект - вуаля всё в порядке :)&lt;br /&gt;&lt;br /&gt;Но дальше следующие грабли. Мастер генерирования HAL на базе Eclipse падает где угодно при показе File open dialog. Пришлось запускаться снова на Windows.&lt;br /&gt;&lt;br /&gt;Генерируем файл описания платформы и проверяем что адреса областей памяти в Linker script верные и совпдают с теми что были в Platform Designer:&lt;br /&gt;&lt;br /&gt;&lt;img src="https://i.imgur.com/z6XOPdsl.png" /&gt;&lt;br /&gt;&lt;br /&gt;Все что нужно попадает в dram, а не flash.&lt;br /&gt;&lt;br /&gt;Собираем Hello world и смотрим на него через nios2-terminal.exe (который цепляется сам к JTAG UART)&lt;br /&gt;&lt;br /&gt;&lt;img src="https://i.imgur.com/OBGbv0Rl.png" /&gt;&lt;br /&gt;&lt;br /&gt;Запускаем на Nios2 такой код:&lt;br /&gt;
&lt;blockquote&gt;&lt;font color="#339933"&gt;#include&amp;nbsp;&amp;lt;stdio.h&amp;gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#339933"&gt;#include&amp;nbsp;&amp;lt;stdint.h&amp;gt;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;font color="#339933"&gt;#define&amp;nbsp;_MMIO_DWORD(mem_addr)&amp;nbsp;(*(volatile&amp;nbsp;uint32_t&amp;nbsp;*)(mem_addr))&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;font color="#339933"&gt;#define&amp;nbsp;BIT0&amp;nbsp;0x1&lt;/font&gt;&lt;br /&gt;
&lt;font color="#339933"&gt;#define&amp;nbsp;BIT1&amp;nbsp;(0x1&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;1)&lt;/font&gt;&lt;br /&gt;
&lt;font color="#339933"&gt;#define&amp;nbsp;BIT2&amp;nbsp;(0x1&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;2)&lt;/font&gt;&lt;br /&gt;
&lt;font color="#339933"&gt;#define&amp;nbsp;BIT3&amp;nbsp;(0x1&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;3)&lt;/font&gt;&lt;br /&gt;
&lt;font color="#339933"&gt;#define&amp;nbsp;BIT4&amp;nbsp;(0x1&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;4)&lt;/font&gt;&lt;br /&gt;
&lt;font color="#339933"&gt;#define&amp;nbsp;BIT5&amp;nbsp;(0x1&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;5)&lt;/font&gt;&lt;br /&gt;
&lt;font color="#339933"&gt;#define&amp;nbsp;BIT6&amp;nbsp;(0x1&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;6)&lt;/font&gt;&lt;br /&gt;
&lt;font color="#339933"&gt;#define&amp;nbsp;BIT7&amp;nbsp;(0x1&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;7)&lt;/font&gt;&lt;br /&gt;
&lt;font color="#339933"&gt;#define&amp;nbsp;BIT8&amp;nbsp;(0x1&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;8)&lt;/font&gt;&lt;br /&gt;
&lt;font color="#339933"&gt;#define&amp;nbsp;BIT9&amp;nbsp;(0x1&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;9)&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;font color="#339933"&gt;#define&amp;nbsp;BIT23&amp;nbsp;(0x1&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;23)&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;font color="#339933"&gt;#define&amp;nbsp;F_CSR&amp;nbsp;_MMIO_DWORD(0x89000)&lt;/font&gt;&lt;br /&gt;
&lt;font color="#339933"&gt;#define&amp;nbsp;F_CCR&amp;nbsp;_MMIO_DWORD(0x89004)&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;font color="#339933"&gt;#define&amp;nbsp;F_SECTOR1(addr)&amp;nbsp;_MMIO_DWORD(0x0+addr)&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;font color="#993333"&gt;void&lt;/font&gt;&amp;nbsp;print_status&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#123;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#993333"&gt;uint32_t&lt;/font&gt;&amp;nbsp;t&amp;nbsp;&lt;font color="#339933"&gt;=&lt;/font&gt;&amp;nbsp;F_CSR&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;Flash&amp;nbsp;is&amp;nbsp;&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#b1b100"&gt;switch&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;t&amp;nbsp;&lt;font color="#339933"&gt;&amp;amp;&lt;/font&gt;&amp;nbsp;&lt;font color="#208080"&gt;0x3&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#123;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#b1b100"&gt;case&lt;/font&gt;&amp;nbsp;&lt;font color="#0000dd"&gt;0&lt;/font&gt;&lt;font color="#339933"&gt;:&lt;/font&gt;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;IDLE&amp;nbsp;&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color="#000000"&gt;break&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#b1b100"&gt;case&lt;/font&gt;&amp;nbsp;&lt;font color="#0000dd"&gt;1&lt;/font&gt;&lt;font color="#339933"&gt;:&lt;/font&gt;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;BUSY_ERASE&amp;nbsp;&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color="#000000"&gt;break&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#b1b100"&gt;case&lt;/font&gt;&amp;nbsp;&lt;font color="#0000dd"&gt;2&lt;/font&gt;&lt;font color="#339933"&gt;:&lt;/font&gt;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;BUSY_WRITE&amp;nbsp;&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color="#000000"&gt;break&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#b1b100"&gt;case&lt;/font&gt;&amp;nbsp;&lt;font color="#0000dd"&gt;3&lt;/font&gt;&lt;font color="#339933"&gt;:&lt;/font&gt;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;BUSY_READ&amp;nbsp;&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color="#000000"&gt;break&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#125;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;&lt;font color="#000099"&gt;\n&lt;/font&gt;Write&amp;nbsp;protect&amp;nbsp;status:&lt;font color="#000099"&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;&amp;nbsp;&amp;nbsp;Sector&amp;nbsp;ID&amp;nbsp;1&amp;nbsp;is&amp;nbsp;&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#b1b100"&gt;if&lt;/font&gt;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;t&amp;nbsp;&lt;font color="#339933"&gt;&amp;amp;&lt;/font&gt;&amp;nbsp;BIT5&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;protected&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color="#b1b100"&gt;else&lt;/font&gt;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;open&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;&lt;font color="#000099"&gt;\n&lt;/font&gt;&amp;nbsp;&amp;nbsp;Sector&amp;nbsp;ID&amp;nbsp;2&amp;nbsp;is&amp;nbsp;&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#b1b100"&gt;if&lt;/font&gt;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;t&amp;nbsp;&lt;font color="#339933"&gt;&amp;amp;&lt;/font&gt;&amp;nbsp;BIT6&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;protected&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color="#b1b100"&gt;else&lt;/font&gt;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;open&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;&lt;font color="#000099"&gt;\n&lt;/font&gt;&amp;nbsp;&amp;nbsp;Sector&amp;nbsp;ID&amp;nbsp;3&amp;nbsp;is&amp;nbsp;&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#b1b100"&gt;if&lt;/font&gt;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;t&amp;nbsp;&lt;font color="#339933"&gt;&amp;amp;&lt;/font&gt;&amp;nbsp;BIT7&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;protected&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color="#b1b100"&gt;else&lt;/font&gt;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;open&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;&lt;font color="#000099"&gt;\n&lt;/font&gt;&amp;nbsp;&amp;nbsp;Sector&amp;nbsp;ID&amp;nbsp;4&amp;nbsp;is&amp;nbsp;&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#b1b100"&gt;if&lt;/font&gt;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;t&amp;nbsp;&lt;font color="#339933"&gt;&amp;amp;&lt;/font&gt;&amp;nbsp;BIT8&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;protected&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color="#b1b100"&gt;else&lt;/font&gt;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;open&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;&lt;font color="#000099"&gt;\n&lt;/font&gt;&amp;nbsp;&amp;nbsp;Sector&amp;nbsp;ID&amp;nbsp;5&amp;nbsp;is&amp;nbsp;&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#b1b100"&gt;if&lt;/font&gt;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;t&amp;nbsp;&lt;font color="#339933"&gt;&amp;amp;&lt;/font&gt;&amp;nbsp;BIT9&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;protected&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color="#b1b100"&gt;else&lt;/font&gt;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;open&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;&lt;font color="#000099"&gt;\n&lt;/font&gt;Last&amp;nbsp;operation&amp;nbsp;status&amp;nbsp;(if&amp;nbsp;any,&amp;nbsp;default&amp;nbsp;-&amp;nbsp;failed)&lt;font color="#000099"&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;Read&amp;nbsp;is&amp;nbsp;&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#b1b100"&gt;if&lt;/font&gt;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;t&amp;nbsp;&lt;font color="#339933"&gt;&amp;amp;&lt;/font&gt;&amp;nbsp;BIT2&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;successful&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color="#b1b100"&gt;else&lt;/font&gt;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;failed&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;&lt;font color="#000099"&gt;\n&lt;/font&gt;Write&amp;nbsp;is&amp;nbsp;&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#b1b100"&gt;if&lt;/font&gt;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;t&amp;nbsp;&lt;font color="#339933"&gt;&amp;amp;&lt;/font&gt;&amp;nbsp;BIT3&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;successful&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color="#b1b100"&gt;else&lt;/font&gt;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;failed&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;&lt;font color="#000099"&gt;\n&lt;/font&gt;Erase&amp;nbsp;is&amp;nbsp;&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#b1b100"&gt;if&lt;/font&gt;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;t&amp;nbsp;&lt;font color="#339933"&gt;&amp;amp;&lt;/font&gt;&amp;nbsp;BIT4&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;successful&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color="#b1b100"&gt;else&lt;/font&gt;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;failed&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;&lt;font color="#000099"&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#009900"&gt;&amp;#125;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;font color="#993333"&gt;void&lt;/font&gt;&amp;nbsp;print_control&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#123;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#993333"&gt;uint32_t&lt;/font&gt;&amp;nbsp;t&amp;nbsp;&lt;font color="#339933"&gt;=&lt;/font&gt;&amp;nbsp;F_CCR&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;Sector&amp;nbsp;ID&amp;nbsp;1&amp;nbsp;is&amp;nbsp;&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#b1b100"&gt;if&lt;/font&gt;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;t&amp;nbsp;&lt;font color="#339933"&gt;&amp;amp;&lt;/font&gt;&amp;nbsp;BIT23&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;write&amp;nbsp;protected&lt;font color="#000099"&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color="#b1b100"&gt;else&lt;/font&gt;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;open&lt;font color="#000099"&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#009900"&gt;&amp;#125;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;font color="#993333"&gt;int&lt;/font&gt;&amp;nbsp;main&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#009900"&gt;&amp;#123;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print_status&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;F_CCR&amp;nbsp;&lt;font color="#339933"&gt;=&lt;/font&gt;&amp;nbsp;&lt;font color="#208080"&gt;0xffffffff&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print_control&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;F_CCR&amp;nbsp;&lt;font color="#339933"&gt;=&lt;/font&gt;&amp;nbsp;&lt;font color="#208080"&gt;0xffffffff&lt;/font&gt;&amp;nbsp;&lt;font color="#339933"&gt;^&lt;/font&gt;&amp;nbsp;BIT23&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print_control&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;Data&amp;nbsp;from&amp;nbsp;address&amp;nbsp;0x0&amp;nbsp;is&amp;nbsp;%08X&lt;font color="#000099"&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;F_SECTOR1&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#0000dd"&gt;0&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;Writing&amp;nbsp;data&amp;nbsp;to&amp;nbsp;address&amp;nbsp;0x0...&lt;font color="#000099"&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;F_SECTOR1&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#0000dd"&gt;0&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color="#339933"&gt;=&lt;/font&gt;&amp;nbsp;&lt;font color="#208080"&gt;0xcafebabe&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;Waiting&amp;nbsp;for&amp;nbsp;IDLE...&lt;font color="#000099"&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#b1b100"&gt;while&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;F_CSR&amp;nbsp;&lt;font color="#339933"&gt;&amp;amp;&lt;/font&gt;&amp;nbsp;&lt;font color="#208080"&gt;0x3&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print_status&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#000066"&gt;printf&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#ff0000"&gt;&amp;quot;Data&amp;nbsp;from&amp;nbsp;address&amp;nbsp;0x0&amp;nbsp;is&amp;nbsp;%08X&lt;font color="#000099"&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;F_SECTOR1&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#0000dd"&gt;0&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color="#009900"&gt;&amp;#125;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&lt;/blockquote&gt;
&lt;br /&gt;&lt;br /&gt;Всё работает, ура!!!&lt;br /&gt;&lt;br /&gt;&lt;img src="https://i.imgur.com/qyC6wfxl.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=1156" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2016-12-30:2658815:840</id>
    <link rel="alternate" type="text/html" href="https://x86128.dreamwidth.org/840.html"/>
    <link rel="self" type="text/xml" href="https://x86128.dreamwidth.org/data/atom/?itemid=840"/>
    <title>Обновление Memory initialization file в Quartus без пересборки проекта</title>
    <published>2019-05-06T14:22:26Z</published>
    <updated>2019-05-06T14:23:24Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">Без длительной пересборки проекта с нуля можно быстро обновить содержимое блоков памяти из командной строки:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
quartus_cdb --update_mif "project name"
quartus_asm "project name"
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;А затем выполнить загрузку:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
CABLE_NAME   ?= "USB-Blaster"
PROJECT_NAME ?= de10-lite

quartus_pgm -c $(CABLE_NAME) -m JTAG -o "p;$(PROJECT_NAME).sof"
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://www.intel.com/content/www/us/en/programmable/support/support-resources/knowledge-base/solutions/rd12062004_8707.html"&gt;https://www.intel.com/content/www/us/en/programmable/support/support-resources/knowledge-base/solutions/rd12062004_8707.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=840" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2016-12-30:2658815:544</id>
    <link rel="alternate" type="text/html" href="https://x86128.dreamwidth.org/544.html"/>
    <link rel="self" type="text/xml" href="https://x86128.dreamwidth.org/data/atom/?itemid=544"/>
    <title>Об обустройстве окружения в Linux</title>
    <published>2019-05-02T15:33:36Z</published>
    <updated>2019-05-04T11:41:09Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>1</dw:reply-count>
    <content type="html">Попалась &lt;a href="https://wiki.archlinux.org/index.php/Altera_Design_Software"&gt;хорошая статья&lt;/a&gt; о том как завести на линуксе инструменты Альтеры.&lt;br /&gt;&lt;br /&gt;После установки почему то не прописался PATH поэтому добавляем ручками.&lt;br /&gt;Возможно будет необходимо установить некоторые 32-битные библиотеки, поскольку не все инструменты альтеры переведены на 64 бита.&lt;br /&gt;&lt;br /&gt;Конкретно в моем случае на Ubuntu 18.04 x86-64 не было прав доступа у пользователя до USB-blaster&lt;br /&gt;&lt;br /&gt;Вылечивается так:&lt;br /&gt;Создаем файл: /etc/udev/rules.d/51-altera-usb-blaster.rules&lt;br /&gt;&lt;br /&gt;С таким содержимым:&lt;br /&gt;&lt;pre&gt;
SUBSYSTEM==&amp;quot;usb&amp;quot;, ATTR{idVendor}==&amp;quot;09fb&amp;quot;, ATTR{idProduct}==&amp;quot;6001&amp;quot;, MODE=&amp;quot;0666&amp;quot;
SUBSYSTEM==&amp;quot;usb&amp;quot;, ATTR{idVendor}==&amp;quot;09fb&amp;quot;, ATTR{idProduct}==&amp;quot;6002&amp;quot;, MODE=&amp;quot;0666&amp;quot;
SUBSYSTEM==&amp;quot;usb&amp;quot;, ATTR{idVendor}==&amp;quot;09fb&amp;quot;, ATTR{idProduct}==&amp;quot;6003&amp;quot;, MODE=&amp;quot;0666&amp;quot;
SUBSYSTEM==&amp;quot;usb&amp;quot;, ATTR{idVendor}==&amp;quot;09fb&amp;quot;, ATTR{idProduct}==&amp;quot;6010&amp;quot;, MODE=&amp;quot;0666&amp;quot;
SUBSYSTEM==&amp;quot;usb&amp;quot;, ATTR{idVendor}==&amp;quot;09fb&amp;quot;, ATTR{idProduct}==&amp;quot;6810&amp;quot;, MODE=&amp;quot;0666&amp;quot;
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Перетыкаем плату.&lt;br /&gt;&lt;br /&gt;Перегружаем jtag сервер: killall jtagd&lt;br /&gt;&lt;br /&gt;Программатор радует:&lt;br /&gt;&lt;a href="https://imgur.com/crsJLQY"&gt;&lt;img src="https://i.imgur.com/crsJLQYl.png" title="source: imgur.com" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Очень важно чтобы путь установки Quartus был написан с использованием маленьких букв, иначе будут виснуть мастера IP-ядер. &lt;a href="https://www.intel.com/content/www/us/en/programmable/support/support-resources/knowledge-base/solutions/rd12062009_421.html"&gt;https://www.intel.com/content/www/us/en/programmable/support/support-resources/knowledge-base/solutions/rd12062009_421.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=544" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2016-12-30:2658815:293</id>
    <link rel="alternate" type="text/html" href="https://x86128.dreamwidth.org/293.html"/>
    <link rel="self" type="text/xml" href="https://x86128.dreamwidth.org/data/atom/?itemid=293"/>
    <title>DE10-LITE приехала!</title>
    <published>2019-04-30T17:00:16Z</published>
    <updated>2019-04-30T17:00:16Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>14</dw:reply-count>
    <content type="html">Спешу поделиться радостью: прямо перед праздничными выходными почта довезла плату с FPGA Altera Max10 в исполнении Terasic de10-lite.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://i.imgur.com/45f8HBul.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Базовые хеловордлы пройдены: светодиоды, ключи, кнопки, HEX и писк через бузер освоены. Под парами лежат модули RS232 на 3.3v и модуль SD-карточек. &lt;br /&gt;&lt;br /&gt;Версия бузера у меня &lt;a href="https://robotdyn.com/buzzer-module.html"&gt;buzzer&lt;/a&gt; он немного суров, т.к. имеет усилитель на транзисторе 2TY без ограничивающего резистора, поэтому ток протекающий через него получается великоват и он греется. Надо быть внимательным с полярностью управляющего сигнала.&lt;br /&gt;&lt;br /&gt;Для МЭСМ-6 понадобится модуль PLL и блоки памяти M9K.&lt;br /&gt;&lt;br /&gt;Вгрузка памяти программ и данных будет организована пока через mif-файл. Скрипт перевода oct файлов в mif готов.&lt;br /&gt;&lt;br /&gt;В ближайшее время начну вкорячивать МЭСМ-6 в DE10-LITE.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=293" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
</feed>
