<?xml version='1.0' encoding='utf-8' ?>

<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/' xmlns:atom10='http://www.w3.org/2005/Atom'>
<channel>
  <title>x86128</title>
  <link>https://x86128.dreamwidth.org/</link>
  <description>x86128 - Dreamwidth Studios</description>
  <lastBuildDate>Wed, 26 Apr 2023 17:40:08 GMT</lastBuildDate>
  <generator>LiveJournal / Dreamwidth Studios</generator>
  <lj:journal>x86128</lj:journal>
  <lj:journaltype>personal</lj:journaltype>
  <image>
    <url>https://v2.dreamwidth.org/13124707/2658815</url>
    <title>x86128</title>
    <link>https://x86128.dreamwidth.org/</link>
    <width>100</width>
    <height>100</height>
  </image>

<item>
  <guid isPermaLink='true'>https://x86128.dreamwidth.org/5022.html</guid>
  <pubDate>Wed, 26 Apr 2023 17:40:08 GMT</pubDate>
  <title>Приехал китайский RP2040</title>
  <link>https://x86128.dreamwidth.org/5022.html</link>
  <description>Ещё в начале апреля приехала ко мне китайская версия Raspberry Pi Pico:&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://x86128.dreamwidth.org/file/1314.jpg&quot; alt=&quot;&quot; title=&quot;&quot; width=&quot;431&quot; height=&quot;573&quot; /&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=&quot;cut-wrapper&quot;&gt;&lt;span style=&quot;display: none;&quot; id=&quot;span-cuttag___1&quot; class=&quot;cuttag&quot;&gt;&lt;/span&gt;&lt;b class=&quot;cut-open&quot;&gt;(&amp;nbsp;&lt;/b&gt;&lt;b class=&quot;cut-text&quot;&gt;&lt;a href=&quot;https://x86128.dreamwidth.org/5022.html#cutid1&quot;&gt;Read more...&lt;/a&gt;&lt;/b&gt;&lt;b class=&quot;cut-close&quot;&gt;&amp;nbsp;)&lt;/b&gt;&lt;/span&gt;&lt;div style=&quot;display: none;&quot; id=&quot;div-cuttag___1&quot; aria-live=&quot;assertive&quot;&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=5022&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://x86128.dreamwidth.org/5022.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://x86128.dreamwidth.org/4611.html</guid>
  <pubDate>Wed, 26 Apr 2023 10:09:50 GMT</pubDate>
  <title>Немножко юмора в ленту</title>
  <link>https://x86128.dreamwidth.org/4611.html</link>
  <description>&lt;img width=&quot;600px&quot; src=&quot;https://x86128.dreamwidth.org/file/407.jpg&quot; alt=&quot;&quot; title=&quot;transformer&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=4611&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://x86128.dreamwidth.org/4611.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://x86128.dreamwidth.org/4364.html</guid>
  <pubDate>Wed, 20 Oct 2021 09:21:17 GMT</pubDate>
  <title>Кодоген здорового человека</title>
  <link>https://x86128.dreamwidth.org/4364.html</link>
  <description>Рассмотрим теперь простой алгоритм преобразования арифметических (или логических) выражений в машинный код БЭСМ-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;
 (&apos;LABEL&apos;, &apos;arith_main&apos;),
 (&apos;ALLOC&apos;, 1),
Вычисление выражения (без оптимизации) 
(&apos;CLOAD&apos;, 0),
 (&apos;CLOAD&apos;, 1),
 (&apos;CLOAD&apos;, 2),
 (&apos;BINOP&apos;, &apos;*&apos;),
 (&apos;CLOAD&apos;, 3),
 (&apos;BINOP&apos;, &apos;DIV&apos;),
 (&apos;BINOP&apos;, &apos;-&apos;),
Сохранение в переменную А
 (&apos;VSTOR&apos;, -1, &apos;a&apos;),

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

 (&apos;SYSCALL&apos;, &apos;writeln&apos;),
 (&apos;STOP&apos;, &apos;12345&apos;),

 (&apos;LABEL&apos;, &apos;const_table&apos;),
 (&apos;WORD&apos;, 5),
 (&apos;WORD&apos;, 3),
 (&apos;WORD&apos;, 8),
 (&apos;WORD&apos;, 6),
 (&apos;WORD&apos;, 0),
 (&apos;LABEL&apos;, &apos;locals_base&apos;),
 (&apos;LABEL&apos;, &apos;stack_base&apos;)]
&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=&quot;https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=4364&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://x86128.dreamwidth.org/4364.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://x86128.dreamwidth.org/4100.html</guid>
  <pubDate>Tue, 19 Oct 2021 09:30:15 GMT</pubDate>
  <title>Преобразования кода ВМ в код условной БЭСМ-6</title>
  <link>https://x86128.dreamwidth.org/4100.html</link>
  <description>Продолжаю эксперименты со строительством компилятора.&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;
 (&apos;CLOAD&apos;, 0),
 (&apos;CLOAD&apos;, 1),
 (&apos;CLOAD&apos;, 2),
 (&apos;BINOP&apos;, &apos;*&apos;),
 (&apos;CLOAD&apos;, 3),
 (&apos;BINOP&apos;, &apos;DIV&apos;),
 (&apos;BINOP&apos;, &apos;-&apos;),
 (&apos;VSTOR&apos;, -1, &apos;a&apos;),
 (&apos;VLOAD&apos;, -1, &apos;a&apos;),
 (&apos;SYSCALL&apos;, &apos;writeint&apos;),
 (&apos;DEALLOC&apos;, 1),
 (&apos;SYSCALL&apos;, &apos;writeln&apos;),
 (&apos;STOP&apos;, &apos;12345&apos;),

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

Место для локальной переменной a:
 (&apos;WORD&apos;, 0),
 (&apos;LABEL&apos;, &apos;locals_base&apos;),
 (&apos;LABEL&apos;, &apos;stack_base&apos;)]
&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=&quot;https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=4100&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://x86128.dreamwidth.org/4100.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://x86128.dreamwidth.org/3991.html</guid>
  <pubDate>Fri, 15 Oct 2021 15:20:31 GMT</pubDate>
  <title>Маху дал или как можно сравнивать целые числа на БЭСМ-6</title>
  <link>https://x86128.dreamwidth.org/3991.html</link>
  <description>В построении интерпретатора-компилятора я продвинулся до момента когда необходимо преобразовать код виртуальной машины в код еще более близкий к железу, т.е. к МЭСМ-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=&quot;https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=3991&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://x86128.dreamwidth.org/3991.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://x86128.dreamwidth.org/3745.html</guid>
  <pubDate>Thu, 14 Oct 2021 10:38:33 GMT</pubDate>
  <title>Простой шаг оптимизатора по IR</title>
  <link>https://x86128.dreamwidth.org/3745.html</link>
  <description>Сделал простейший шаг оптимизатора по промежуточному представлению, который сворачивает арифметические операции если они совершаются над константами в выражениях.&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=&quot;https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=3745&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://x86128.dreamwidth.org/3745.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://x86128.dreamwidth.org/3485.html</guid>
  <pubDate>Wed, 13 Oct 2021 10:17:11 GMT</pubDate>
  <title>Выдача листинга</title>
  <link>https://x86128.dreamwidth.org/3485.html</link>
  <description>Внёс мелкие исправления и добавил выдачу листинга помимо трассировки. Дальше буду смотреть в сторону принципов изложенных в книге дракона по компиляторам.&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=&quot;https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=3485&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://x86128.dreamwidth.org/3485.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://x86128.dreamwidth.org/3310.html</guid>
  <pubDate>Tue, 12 Oct 2021 09:19:48 GMT</pubDate>
  <title>Пару слов о компиляторе-интерпретаторе</title>
  <link>https://x86128.dreamwidth.org/3310.html</link>
  <description>Доброго времени!&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;
{&apos;c_mem&apos;: [12345, 54321],
 &apos;consts&apos;: {&apos;fail&apos;: {&apos;line&apos;: 4, &apos;offset&apos;: 1, &apos;val&apos;: 54321},
            &apos;pass&apos;: {&apos;line&apos;: 3, &apos;offset&apos;: 0, &apos;val&apos;: 12345}},
 &apos;main&apos;: &apos;Samples_main&apos;,
 &apos;name&apos;: &apos;Samples&apos;,
 &apos;p_text&apos;: [(&apos;LABEL&apos;, &apos;L0&apos;),
            (&apos;VLOAD&apos;, -2, &apos;b&apos;),
            (&apos;CONST&apos;, 0),
            (&apos;RELOP&apos;, &apos;&amp;gt;&apos;),
            (&apos;BR_ZERO&apos;, &apos;L1&apos;),
            (&apos;VLOAD&apos;, -2, &apos;b&apos;),
            (&apos;RSTOR&apos;, -1, &apos;res&apos;),
            (&apos;VLOAD&apos;, -3, &apos;a&apos;),
            (&apos;VLOAD&apos;, -2, &apos;b&apos;),
            (&apos;BINOP&apos;, &apos;MOD&apos;),
            (&apos;VSTOR&apos;, -2, &apos;b&apos;),
            (&apos;RLOAD&apos;, -1, &apos;res&apos;),
            (&apos;VSTOR&apos;, -3, &apos;a&apos;),
            (&apos;BR&apos;, &apos;L0&apos;),
            (&apos;LABEL&apos;, &apos;L1&apos;),
            (&apos;RETURN&apos;, &apos;&apos;),
            (&apos;ALLOC&apos;, 1),
            (&apos;CONST&apos;, 27),
            (&apos;CONST&apos;, 25),
            (&apos;CONST&apos;, 3),
            (&apos;BINOP&apos;, &apos;*&apos;),
            (&apos;BINOP&apos;, &apos;+&apos;),
            (&apos;CONST&apos;, 10),
            (&apos;CONST&apos;, 5),
            (&apos;BINOP&apos;, &apos;DIV&apos;),
            (&apos;BINOP&apos;, &apos;-&apos;),
            (&apos;CONST&apos;, 15),
            (&apos;ADR_LOAD&apos;, -1, &apos;t&apos;),
            (&apos;CALL&apos;, 0, &apos;gcd&apos;),
            (&apos;DEALLOC&apos;, 3),
            (&apos;VLOAD&apos;, -1, &apos;t&apos;),
            (&apos;CONST&apos;, 5),
            (&apos;RELOP&apos;, &apos;=&apos;),
            (&apos;BR_ZERO&apos;, &apos;L3&apos;),
            (&apos;CLOAD&apos;, 0, &apos;pass&apos;),
            (&apos;SYSCALL&apos;, &apos;halt&apos;),
            (&apos;DEALLOC&apos;, 1),
            (&apos;BR&apos;, &apos;L3&apos;),
            (&apos;LABEL&apos;, &apos;L2&apos;),
            (&apos;CLOAD&apos;, 1, &apos;fail&apos;),
            (&apos;SYSCALL&apos;, &apos;halt&apos;),
            (&apos;DEALLOC&apos;, 1),
            (&apos;LABEL&apos;, &apos;L3&apos;),
            (&apos;STOP&apos;, &apos;12345&apos;)],
 &apos;proc_tab&apos;: {&apos;Samples_main&apos;: {&apos;offset&apos;: 16},
              &apos;gcd&apos;: {&apos;arg_sz&apos;: 3,
                      &apos;args&apos;: {&apos;a&apos;: {&apos;offset&apos;: 2,
                                     &apos;typ&apos;: &apos;integer&apos;,
                                     &apos;var&apos;: False},
                               &apos;b&apos;: {&apos;offset&apos;: 1,
                                     &apos;typ&apos;: &apos;integer&apos;,
                                     &apos;var&apos;: False},
                               &apos;res&apos;: {&apos;offset&apos;: 0,
                                       &apos;typ&apos;: &apos;integer&apos;,
                                       &apos;var&apos;: True}},
                      &apos;consts&apos;: {},
                      &apos;offset&apos;: 0,
                      &apos;v_size&apos;: 0,
                      &apos;vars&apos;: {}}},
 &apos;v_size&apos;: 1,
 &apos;vars&apos;: {&apos;t&apos;: {&apos;offset&apos;: 0, &apos;size&apos;: 1, &apos;typ&apos;: &apos;integer&apos;}}}
&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=(&apos;ALLOC&apos;, 1) PC=16 BP=1 SP=1 D_MEM=[0]
OP=(&apos;CONST&apos;, 27) PC=17 BP=1 SP=2 D_MEM=[0, 27]
OP=(&apos;CONST&apos;, 25) PC=18 BP=1 SP=3 D_MEM=[0, 27, 25]
OP=(&apos;CONST&apos;, 3) PC=19 BP=1 SP=4 D_MEM=[0, 27, 25, 3]
OP=(&apos;BINOP&apos;, &apos;*&apos;) PC=20 BP=1 SP=3 D_MEM=[0, 27, 75]
OP=(&apos;BINOP&apos;, &apos;+&apos;) PC=21 BP=1 SP=2 D_MEM=[0, 102]
OP=(&apos;CONST&apos;, 10) PC=22 BP=1 SP=3 D_MEM=[0, 102, 10]
OP=(&apos;CONST&apos;, 5) PC=23 BP=1 SP=4 D_MEM=[0, 102, 10, 5]
OP=(&apos;BINOP&apos;, &apos;DIV&apos;) PC=24 BP=1 SP=3 D_MEM=[0, 102, 2]
OP=(&apos;BINOP&apos;, &apos;-&apos;) PC=25 BP=1 SP=2 D_MEM=[0, 100]
OP=(&apos;CONST&apos;, 15) PC=26 BP=1 SP=3 D_MEM=[0, 100, 15]
OP=(&apos;ADR_LOAD&apos;, -1, &apos;t&apos;) PC=27 BP=1 SP=4 D_MEM=[0, 100, 15, 0]
OP=(&apos;CALL&apos;, 0, &apos;gcd&apos;) PC=28 BP=4 SP=6 D_MEM=[0, 100, 15, 0, 1, 29]
OP=(&apos;LABEL&apos;, &apos;L0&apos;) PC=0 BP=4 SP=6 D_MEM=[0, 100, 15, 0, 1, 29]
OP=(&apos;VLOAD&apos;, -2, &apos;b&apos;) PC=1 BP=4 SP=7 D_MEM=[0, 100, 15, 0, 1, 29, 15]
OP=(&apos;CONST&apos;, 0) PC=2 BP=4 SP=8 D_MEM=[0, 100, 15, 0, 1, 29, 15, 0]
OP=(&apos;RELOP&apos;, &apos;&amp;gt;&apos;) PC=3 BP=4 SP=7 D_MEM=[0, 100, 15, 0, 1, 29, True]
OP=(&apos;BR_ZERO&apos;, &apos;L1&apos;) PC=4 BP=4 SP=6 D_MEM=[0, 100, 15, 0, 1, 29]
OP=(&apos;VLOAD&apos;, -2, &apos;b&apos;) PC=5 BP=4 SP=7 D_MEM=[0, 100, 15, 0, 1, 29, 15]
OP=(&apos;RSTOR&apos;, -1, &apos;res&apos;) PC=6 BP=4 SP=6 D_MEM=[15, 100, 15, 0, 1, 29]
OP=(&apos;VLOAD&apos;, -3, &apos;a&apos;) PC=7 BP=4 SP=7 D_MEM=[15, 100, 15, 0, 1, 29, 100]
OP=(&apos;VLOAD&apos;, -2, &apos;b&apos;) PC=8 BP=4 SP=8 D_MEM=[15, 100, 15, 0, 1, 29, 100, 15]
OP=(&apos;BINOP&apos;, &apos;MOD&apos;) PC=9 BP=4 SP=7 D_MEM=[15, 100, 15, 0, 1, 29, 10]
OP=(&apos;VSTOR&apos;, -2, &apos;b&apos;) PC=10 BP=4 SP=6 D_MEM=[15, 100, 10, 0, 1, 29]
OP=(&apos;RLOAD&apos;, -1, &apos;res&apos;) PC=11 BP=4 SP=7 D_MEM=[15, 100, 10, 0, 1, 29, 15]
OP=(&apos;VSTOR&apos;, -3, &apos;a&apos;) PC=12 BP=4 SP=6 D_MEM=[15, 15, 10, 0, 1, 29]
OP=(&apos;BR&apos;, &apos;L0&apos;) PC=13 BP=4 SP=6 D_MEM=[15, 15, 10, 0, 1, 29]
OP=(&apos;LABEL&apos;, &apos;L0&apos;) PC=0 BP=4 SP=6 D_MEM=[15, 15, 10, 0, 1, 29]
OP=(&apos;VLOAD&apos;, -2, &apos;b&apos;) PC=1 BP=4 SP=7 D_MEM=[15, 15, 10, 0, 1, 29, 10]
OP=(&apos;CONST&apos;, 0) PC=2 BP=4 SP=8 D_MEM=[15, 15, 10, 0, 1, 29, 10, 0]
OP=(&apos;RELOP&apos;, &apos;&amp;gt;&apos;) PC=3 BP=4 SP=7 D_MEM=[15, 15, 10, 0, 1, 29, True]
OP=(&apos;BR_ZERO&apos;, &apos;L1&apos;) PC=4 BP=4 SP=6 D_MEM=[15, 15, 10, 0, 1, 29]
OP=(&apos;VLOAD&apos;, -2, &apos;b&apos;) PC=5 BP=4 SP=7 D_MEM=[15, 15, 10, 0, 1, 29, 10]
OP=(&apos;RSTOR&apos;, -1, &apos;res&apos;) PC=6 BP=4 SP=6 D_MEM=[10, 15, 10, 0, 1, 29]
OP=(&apos;VLOAD&apos;, -3, &apos;a&apos;) PC=7 BP=4 SP=7 D_MEM=[10, 15, 10, 0, 1, 29, 15]
OP=(&apos;VLOAD&apos;, -2, &apos;b&apos;) PC=8 BP=4 SP=8 D_MEM=[10, 15, 10, 0, 1, 29, 15, 10]
OP=(&apos;BINOP&apos;, &apos;MOD&apos;) PC=9 BP=4 SP=7 D_MEM=[10, 15, 10, 0, 1, 29, 5]
OP=(&apos;VSTOR&apos;, -2, &apos;b&apos;) PC=10 BP=4 SP=6 D_MEM=[10, 15, 5, 0, 1, 29]
OP=(&apos;RLOAD&apos;, -1, &apos;res&apos;) PC=11 BP=4 SP=7 D_MEM=[10, 15, 5, 0, 1, 29, 10]
OP=(&apos;VSTOR&apos;, -3, &apos;a&apos;) PC=12 BP=4 SP=6 D_MEM=[10, 10, 5, 0, 1, 29]
OP=(&apos;BR&apos;, &apos;L0&apos;) PC=13 BP=4 SP=6 D_MEM=[10, 10, 5, 0, 1, 29]
OP=(&apos;LABEL&apos;, &apos;L0&apos;) PC=0 BP=4 SP=6 D_MEM=[10, 10, 5, 0, 1, 29]
OP=(&apos;VLOAD&apos;, -2, &apos;b&apos;) PC=1 BP=4 SP=7 D_MEM=[10, 10, 5, 0, 1, 29, 5]
OP=(&apos;CONST&apos;, 0) PC=2 BP=4 SP=8 D_MEM=[10, 10, 5, 0, 1, 29, 5, 0]
OP=(&apos;RELOP&apos;, &apos;&amp;gt;&apos;) PC=3 BP=4 SP=7 D_MEM=[10, 10, 5, 0, 1, 29, True]
OP=(&apos;BR_ZERO&apos;, &apos;L1&apos;) PC=4 BP=4 SP=6 D_MEM=[10, 10, 5, 0, 1, 29]
OP=(&apos;VLOAD&apos;, -2, &apos;b&apos;) PC=5 BP=4 SP=7 D_MEM=[10, 10, 5, 0, 1, 29, 5]
OP=(&apos;RSTOR&apos;, -1, &apos;res&apos;) PC=6 BP=4 SP=6 D_MEM=[5, 10, 5, 0, 1, 29]
OP=(&apos;VLOAD&apos;, -3, &apos;a&apos;) PC=7 BP=4 SP=7 D_MEM=[5, 10, 5, 0, 1, 29, 10]
OP=(&apos;VLOAD&apos;, -2, &apos;b&apos;) PC=8 BP=4 SP=8 D_MEM=[5, 10, 5, 0, 1, 29, 10, 5]
OP=(&apos;BINOP&apos;, &apos;MOD&apos;) PC=9 BP=4 SP=7 D_MEM=[5, 10, 5, 0, 1, 29, 0]
OP=(&apos;VSTOR&apos;, -2, &apos;b&apos;) PC=10 BP=4 SP=6 D_MEM=[5, 10, 0, 0, 1, 29]
OP=(&apos;RLOAD&apos;, -1, &apos;res&apos;) PC=11 BP=4 SP=7 D_MEM=[5, 10, 0, 0, 1, 29, 5]
OP=(&apos;VSTOR&apos;, -3, &apos;a&apos;) PC=12 BP=4 SP=6 D_MEM=[5, 5, 0, 0, 1, 29]
OP=(&apos;BR&apos;, &apos;L0&apos;) PC=13 BP=4 SP=6 D_MEM=[5, 5, 0, 0, 1, 29]
OP=(&apos;LABEL&apos;, &apos;L0&apos;) PC=0 BP=4 SP=6 D_MEM=[5, 5, 0, 0, 1, 29]
OP=(&apos;VLOAD&apos;, -2, &apos;b&apos;) PC=1 BP=4 SP=7 D_MEM=[5, 5, 0, 0, 1, 29, 0]
OP=(&apos;CONST&apos;, 0) PC=2 BP=4 SP=8 D_MEM=[5, 5, 0, 0, 1, 29, 0, 0]
OP=(&apos;RELOP&apos;, &apos;&amp;gt;&apos;) PC=3 BP=4 SP=7 D_MEM=[5, 5, 0, 0, 1, 29, False]
OP=(&apos;BR_ZERO&apos;, &apos;L1&apos;) PC=4 BP=4 SP=6 D_MEM=[5, 5, 0, 0, 1, 29]
OP=(&apos;LABEL&apos;, &apos;L1&apos;) PC=14 BP=4 SP=6 D_MEM=[5, 5, 0, 0, 1, 29]
OP=(&apos;RETURN&apos;, &apos;&apos;) PC=15 BP=1 SP=4 D_MEM=[5, 5, 0, 0]
OP=(&apos;DEALLOC&apos;, 3) PC=29 BP=1 SP=1 D_MEM=[5]
OP=(&apos;VLOAD&apos;, -1, &apos;t&apos;) PC=30 BP=1 SP=2 D_MEM=[5, 5]
OP=(&apos;CONST&apos;, 5) PC=31 BP=1 SP=3 D_MEM=[5, 5, 5]
OP=(&apos;RELOP&apos;, &apos;=&apos;) PC=32 BP=1 SP=2 D_MEM=[5, True]
OP=(&apos;BR_ZERO&apos;, &apos;L3&apos;) PC=33 BP=1 SP=1 D_MEM=[5]
OP=(&apos;CLOAD&apos;, 0, &apos;pass&apos;) 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=&quot;https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=3310&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://x86128.dreamwidth.org/3310.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://x86128.dreamwidth.org/2844.html</guid>
  <pubDate>Mon, 04 Oct 2021 07:32:38 GMT</pubDate>
  <title>Компилируем более сложный IF</title>
  <link>https://x86128.dreamwidth.org/2844.html</link>
  <description>Теперь интерпретатор может переварить более сложный тест:&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;
{&apos;decls&apos;: {&apos;consts&apos;: {&apos;fail&apos;: 54321, &apos;pass&apos;: 12345},
           &apos;procs&apos;: {&apos;test1&apos;: {&apos;args&apos;: [],
                               &apos;decls&apos;: {&apos;consts&apos;: {}, &apos;procs&apos;: {}, &apos;vars&apos;: {}},
                               &apos;text&apos;: [(&apos;LOAD&apos;, &apos;t1&apos;),
                                        (&apos;CONST&apos;, 10),
                                        (&apos;RELOP&apos;, &apos;=&apos;),
                                        (&apos;BR_ZERO&apos;, &apos;L0&apos;),
                                        (&apos;CONST&apos;, 9),
                                        (&apos;STOR&apos;, &apos;t1&apos;),
                                        (&apos;BR&apos;, &apos;L2&apos;),
                                        (&apos;LABEL&apos;, &apos;L0&apos;),
                                        (&apos;LOAD&apos;, &apos;t1&apos;),
                                        (&apos;CONST&apos;, 0),
                                        (&apos;RELOP&apos;, &apos;&amp;lt;&apos;),
                                        (&apos;BR_ZERO&apos;, &apos;L1&apos;),
                                        (&apos;LOAD&apos;, &apos;fail&apos;),
                                        (&apos;CALL&apos;, &apos;halt&apos;),
                                        (&apos;BR&apos;, &apos;L2&apos;),
                                        (&apos;LABEL&apos;, &apos;L1&apos;),
                                        (&apos;LOAD&apos;, &apos;fail&apos;),
                                        (&apos;CALL&apos;, &apos;halt&apos;),
                                        (&apos;LABEL&apos;, &apos;L2&apos;)]},
                     &apos;test2&apos;: {&apos;args&apos;: [],
                               &apos;decls&apos;: {&apos;consts&apos;: {}, &apos;procs&apos;: {}, &apos;vars&apos;: {}},
                               &apos;text&apos;: [(&apos;LOAD&apos;, &apos;t1&apos;),
                                        (&apos;CONST&apos;, 10),
                                        (&apos;RELOP&apos;, &apos;=&apos;),
                                        (&apos;BR_ZERO&apos;, &apos;L3&apos;),
                                        (&apos;LOAD&apos;, &apos;fail&apos;),
                                        (&apos;CALL&apos;, &apos;halt&apos;),
                                        (&apos;BR&apos;, &apos;L5&apos;),
                                        (&apos;LABEL&apos;, &apos;L3&apos;),
                                        (&apos;LOAD&apos;, &apos;t1&apos;),
                                        (&apos;CONST&apos;, 0),
                                        (&apos;RELOP&apos;, &apos;&amp;lt;&apos;),
                                        (&apos;BR_ZERO&apos;, &apos;L4&apos;),
                                        (&apos;LOAD&apos;, &apos;fail&apos;),
                                        (&apos;CALL&apos;, &apos;halt&apos;),
                                        (&apos;BR&apos;, &apos;L5&apos;),
                                        (&apos;LABEL&apos;, &apos;L4&apos;),
                                        (&apos;CONST&apos;, 1),
                                        (&apos;UNARY&apos;, &apos;-&apos;),
                                        (&apos;STOR&apos;, &apos;t1&apos;),
                                        (&apos;LABEL&apos;, &apos;L5&apos;)]},
                     &apos;test3&apos;: {&apos;args&apos;: [],
                               &apos;decls&apos;: {&apos;consts&apos;: {}, &apos;procs&apos;: {}, &apos;vars&apos;: {}},
                               &apos;text&apos;: [(&apos;LOAD&apos;, &apos;t1&apos;),
                                        (&apos;CONST&apos;, 10),
                                        (&apos;RELOP&apos;, &apos;=&apos;),
                                        (&apos;BR_ZERO&apos;, &apos;L6&apos;),
                                        (&apos;LOAD&apos;, &apos;fail&apos;),
                                        (&apos;CALL&apos;, &apos;halt&apos;),
                                        (&apos;BR&apos;, &apos;L8&apos;),
                                        (&apos;LABEL&apos;, &apos;L6&apos;),
                                        (&apos;LOAD&apos;, &apos;t1&apos;),
                                        (&apos;CONST&apos;, 0),
                                        (&apos;RELOP&apos;, &apos;&amp;lt;&apos;),
                                        (&apos;BR_ZERO&apos;, &apos;L7&apos;),
                                        (&apos;LOAD&apos;, &apos;pass&apos;),
                                        (&apos;STOR&apos;, &apos;t1&apos;),
                                        (&apos;BR&apos;, &apos;L8&apos;),
                                        (&apos;LABEL&apos;, &apos;L7&apos;),
                                        (&apos;LOAD&apos;, &apos;fail&apos;),
                                        (&apos;CALL&apos;, &apos;halt&apos;),
                                        (&apos;LABEL&apos;, &apos;L8&apos;)]}},
           &apos;vars&apos;: {&apos;t1&apos;: (0, &apos;integer&apos;)}},
 &apos;name&apos;: &apos;Samples&apos;,
 &apos;text&apos;: [(&apos;CONST&apos;, 10),
          (&apos;STOR&apos;, &apos;t1&apos;),
          (&apos;CALL&apos;, &apos;test1&apos;),
          (&apos;CALL&apos;, &apos;test2&apos;),
          (&apos;CALL&apos;, &apos;test3&apos;),
          (&apos;LOAD&apos;, &apos;t1&apos;),
          (&apos;CALL&apos;, &apos;halt&apos;),
          (&apos;STOP&apos;, &apos;12345&apos;)]}
&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=&quot;https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=2844&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://x86128.dreamwidth.org/2844.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://x86128.dreamwidth.org/2731.html</guid>
  <pubDate>Fri, 01 Oct 2021 05:04:14 GMT</pubDate>
  <title>Компиляция оператора IF</title>
  <link>https://x86128.dreamwidth.org/2731.html</link>
  <description>Добавил компиляцию оператора 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
{&apos;decls&apos;: {&apos;consts&apos;: {}, &apos;procs&apos;: {}, &apos;vars&apos;: {&apos;t1&apos;: (0, &apos;integer&apos;)}},
 &apos;name&apos;: &apos;Samples&apos;,
 &apos;text&apos;: [(&apos;CONST&apos;, &apos;10&apos;),
          (&apos;STOR&apos;, &apos;t1&apos;),
          (&apos;LOAD&apos;, &apos;t1&apos;),
          (&apos;CONST&apos;, &apos;10&apos;),
          (&apos;RELOP&apos;, &apos;=&apos;),
          (&apos;BR_ZERO&apos;, &apos;L0&apos;),
          (&apos;CONST&apos;, &apos;10&apos;),
          (&apos;CALL&apos;, &apos;writeint&apos;),
          (&apos;BR&apos;, &apos;L3&apos;),
          (&apos;LABEL&apos;, &apos;L0&apos;),
          (&apos;LOAD&apos;, &apos;t1&apos;),
          (&apos;CONST&apos;, &apos;0&apos;),
          (&apos;RELOP&apos;, &apos;&amp;lt;&apos;),
          (&apos;BR_ZERO&apos;, &apos;L1&apos;),
          (&apos;CONST&apos;, &apos;5&apos;),
          (&apos;UNARY&apos;, &apos;-&apos;),
          (&apos;CALL&apos;, &apos;writeint&apos;),
          (&apos;BR&apos;, &apos;L3&apos;),
          (&apos;LABEL&apos;, &apos;L1&apos;),
          (&apos;CONST&apos;, &apos;44&apos;),
          (&apos;CALL&apos;, &apos;writeint&apos;),
          (&apos;LABEL&apos;, &apos;L3&apos;),
          (&apos;STOP&apos;, &apos;&apos;)]}
10
STOP at 22
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=2731&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://x86128.dreamwidth.org/2731.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://x86128.dreamwidth.org/2403.html</guid>
  <pubDate>Thu, 30 Sep 2021 10:13:45 GMT</pubDate>
  <title>Изготовление небольшого компилятора-интерпретатора</title>
  <link>https://x86128.dreamwidth.org/2403.html</link>
  <description>В качестве эксперимента затеял сделать минимально возможный компилятор языка похожего на 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) грамматики, на основе входного потока токенов от лексера, строит подобие синтаксического дерева. Далее &quot;дерево&quot; обходится компилятором который строит код для абстрактной стековой машины. Далее виртуальная машина выполняет код используя стек данных и стек фреймов (куда напресовываются рабочие области процедур (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
{&apos;decls&apos;: {&apos;consts&apos;: {},
           &apos;procs&apos;: {&apos;gcd&apos;: {&apos;args&apos;: [(&apos;a&apos;, &apos;integer&apos;), (&apos;b&apos;, &apos;integer&apos;)],
                             &apos;decls&apos;: {&apos;consts&apos;: {},
                                       &apos;procs&apos;: {},
                                       &apos;vars&apos;: {&apos;a&apos;: (0, &apos;integer&apos;),
                                                &apos;b&apos;: (0, &apos;integer&apos;),
                                                &apos;t&apos;: (0, &apos;integer&apos;)}},
                             &apos;text&apos;: [(&apos;STOR&apos;, &apos;b&apos;),
                                      (&apos;STOR&apos;, &apos;a&apos;),
                                      (&apos;LABEL&apos;, &apos;L0&apos;),
                                      (&apos;LOAD&apos;, &apos;b&apos;),
                                      (&apos;CONST&apos;, &apos;0&apos;),
                                      (&apos;RELOP&apos;, &apos;&amp;gt;&apos;),
                                      (&apos;BR_ZERO&apos;, &apos;L1&apos;),
                                      (&apos;LOAD&apos;, &apos;b&apos;),
                                      (&apos;STOR&apos;, &apos;t&apos;),
                                      (&apos;LOAD&apos;, &apos;a&apos;),
                                      (&apos;LOAD&apos;, &apos;b&apos;),
                                      (&apos;BINOP&apos;, &apos;mod&apos;),
                                      (&apos;STOR&apos;, &apos;b&apos;),
                                      (&apos;LOAD&apos;, &apos;t&apos;),
                                      (&apos;STOR&apos;, &apos;a&apos;),
                                      (&apos;BR&apos;, &apos;L0&apos;),
                                      (&apos;LABEL&apos;, &apos;L1&apos;),
                                      (&apos;LOAD&apos;, &apos;a&apos;),
                                      (&apos;CALL&apos;, &apos;writeint&apos;)]}},
           &apos;vars&apos;: {}},
 &apos;name&apos;: &apos;Samples&apos;,
 &apos;text&apos;: [(&apos;CONST&apos;, &apos;27&apos;),
          (&apos;CONST&apos;, &apos;25&apos;),
          (&apos;CONST&apos;, &apos;3&apos;),
          (&apos;BINOP&apos;, &apos;*&apos;),
          (&apos;BINOP&apos;, &apos;+&apos;),
          (&apos;CONST&apos;, &apos;10&apos;),
          (&apos;CONST&apos;, &apos;5&apos;),
          (&apos;BINOP&apos;, &apos;div&apos;),
          (&apos;BINOP&apos;, &apos;-&apos;),
          (&apos;CONST&apos;, &apos;15&apos;),
          (&apos;CALL&apos;, &apos;gcd&apos;),
          (&apos;STOP&apos;, &apos;&apos;)]}
&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=&quot;https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=2403&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://x86128.dreamwidth.org/2403.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://x86128.dreamwidth.org/2247.html</guid>
  <pubDate>Mon, 12 Jul 2021 07:09:31 GMT</pubDate>
  <title>Полезная утилитка: qrencode</title>
  <link>https://x86128.dreamwidth.org/2247.html</link>
  <description>Обнаружилась полезная утилитка &lt;code&gt;qrencode&lt;/code&gt; для генерирования QR-кодов прям из консоли linux:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;qrencode -t ansiutf8 &apos;Hello, world!!!&apos;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://imgur.com/iRD7n8F&quot;&gt;&lt;img src=&quot;https://i.imgur.com/iRD7n8F.png&quot; title=&quot;source: imgur.com&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Таким образом сейчас можно в некоторые программы переносить начальные настройки, например, настройки туннелей в wireguard (или nextcloud), а сам код отправить почтой домашним или родственникам чтобы они щелкнули смартфоном, кому настраивать собственную VPS-ку может быть сложно.&lt;br /&gt;&lt;br /&gt;В дополнение к посту &lt;a href=&quot;https://x86128.dreamwidth.org/1575.html&quot;&gt;https://x86128.dreamwidth.org/1575.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=2247&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://x86128.dreamwidth.org/2247.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://x86128.dreamwidth.org/1895.html</guid>
  <pubDate>Fri, 30 Apr 2021 15:43:28 GMT</pubDate>
  <title>Баловство на Python</title>
  <link>https://x86128.dreamwidth.org/1895.html</link>
  <description>В качестве небольшого 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=&quot;https://github.com/x86128/pymesm&quot;&gt;https://github.com/x86128/pymesm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br type=&quot;_moz&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=1895&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://x86128.dreamwidth.org/1895.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://x86128.dreamwidth.org/1575.html</guid>
  <pubDate>Sun, 04 Apr 2021 06:30:53 GMT</pubDate>
  <title>Борьба с весенним обострением</title>
  <link>https://x86128.dreamwidth.org/1575.html</link>
  <description>Доброго дня!&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=&quot;_moz&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=1575&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://x86128.dreamwidth.org/1575.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://x86128.dreamwidth.org/1463.html</guid>
  <pubDate>Thu, 10 Dec 2020 07:53:27 GMT</pubDate>
  <title>Загрузка с виниловой пластинки? А почему бы и нет.</title>
  <link>https://x86128.dreamwidth.org/1463.html</link>
  <description>Ссылка на оригинальную статью от автора: &lt;a href=&quot;http://boginjr.com/it/sw/dev/vinyl-boot/&quot;&gt;http://boginjr.com/it/sw/dev/vinyl-boot/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe width=&quot;1280&quot; height=&quot;720&quot; src=&quot;https://www.youtube.com/embed/bqz65_YfcJg&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;allowfullscreen&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=1463&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://x86128.dreamwidth.org/1463.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://x86128.dreamwidth.org/1156.html</guid>
  <pubDate>Sat, 11 May 2019 17:13:48 GMT</pubDate>
  <title>Сложные системы не без граблей</title>
  <link>https://x86128.dreamwidth.org/1156.html</link>
  <description>Продолжаю осваивать 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=&quot;https://i.imgur.com/ry4tT94l.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Хотя я и не просил:&lt;br /&gt;&lt;img src=&quot;https://i.imgur.com/HfBqaCtl.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Заглядываем в мастер систем:&lt;br /&gt;&lt;img src=&quot;https://i.imgur.com/kvFI1T1l.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Глобальные настройки тоже все в порядке, везде галочки выключены.&lt;br /&gt;&lt;br /&gt;Смотрим в отчет:&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://i.imgur.com/l3TXgIRl.png&quot; /&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=&quot;https://i.imgur.com/z6XOPdsl.png&quot; /&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=&quot;https://i.imgur.com/OBGbv0Rl.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Запускаем на Nios2 такой код:&lt;br /&gt;
&lt;blockquote&gt;&lt;font color=&quot;#339933&quot;&gt;#include&amp;nbsp;&amp;lt;stdio.h&amp;gt;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#339933&quot;&gt;#include&amp;nbsp;&amp;lt;stdint.h&amp;gt;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;font color=&quot;#339933&quot;&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=&quot;#339933&quot;&gt;#define&amp;nbsp;BIT0&amp;nbsp;0x1&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#339933&quot;&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=&quot;#339933&quot;&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=&quot;#339933&quot;&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=&quot;#339933&quot;&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=&quot;#339933&quot;&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=&quot;#339933&quot;&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=&quot;#339933&quot;&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=&quot;#339933&quot;&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=&quot;#339933&quot;&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=&quot;#339933&quot;&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=&quot;#339933&quot;&gt;#define&amp;nbsp;F_CSR&amp;nbsp;_MMIO_DWORD(0x89000)&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#339933&quot;&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=&quot;#339933&quot;&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=&quot;#993333&quot;&gt;void&lt;/font&gt;&amp;nbsp;print_status&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#009900&quot;&gt;&amp;#123;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#993333&quot;&gt;uint32_t&lt;/font&gt;&amp;nbsp;t&amp;nbsp;&lt;font color=&quot;#339933&quot;&gt;=&lt;/font&gt;&amp;nbsp;F_CSR&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;Flash&amp;nbsp;is&amp;nbsp;&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#b1b100&quot;&gt;switch&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;t&amp;nbsp;&lt;font color=&quot;#339933&quot;&gt;&amp;amp;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#208080&quot;&gt;0x3&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#009900&quot;&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=&quot;#b1b100&quot;&gt;case&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#0000dd&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;:&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;IDLE&amp;nbsp;&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#000000&quot;&gt;break&lt;/font&gt;&lt;font color=&quot;#339933&quot;&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=&quot;#b1b100&quot;&gt;case&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#0000dd&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;:&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;BUSY_ERASE&amp;nbsp;&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#000000&quot;&gt;break&lt;/font&gt;&lt;font color=&quot;#339933&quot;&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=&quot;#b1b100&quot;&gt;case&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#0000dd&quot;&gt;2&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;:&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;BUSY_WRITE&amp;nbsp;&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#000000&quot;&gt;break&lt;/font&gt;&lt;font color=&quot;#339933&quot;&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=&quot;#b1b100&quot;&gt;case&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#0000dd&quot;&gt;3&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;:&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;BUSY_READ&amp;nbsp;&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#000000&quot;&gt;break&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#009900&quot;&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=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;&lt;font color=&quot;#000099&quot;&gt;\n&lt;/font&gt;Write&amp;nbsp;protect&amp;nbsp;status:&lt;font color=&quot;#000099&quot;&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&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=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#b1b100&quot;&gt;if&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;t&amp;nbsp;&lt;font color=&quot;#339933&quot;&gt;&amp;amp;&lt;/font&gt;&amp;nbsp;BIT5&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;protected&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#b1b100&quot;&gt;else&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;open&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;&lt;font color=&quot;#000099&quot;&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=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#b1b100&quot;&gt;if&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;t&amp;nbsp;&lt;font color=&quot;#339933&quot;&gt;&amp;amp;&lt;/font&gt;&amp;nbsp;BIT6&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;protected&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#b1b100&quot;&gt;else&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;open&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;&lt;font color=&quot;#000099&quot;&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=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#b1b100&quot;&gt;if&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;t&amp;nbsp;&lt;font color=&quot;#339933&quot;&gt;&amp;amp;&lt;/font&gt;&amp;nbsp;BIT7&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;protected&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#b1b100&quot;&gt;else&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;open&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;&lt;font color=&quot;#000099&quot;&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=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#b1b100&quot;&gt;if&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;t&amp;nbsp;&lt;font color=&quot;#339933&quot;&gt;&amp;amp;&lt;/font&gt;&amp;nbsp;BIT8&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;protected&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#b1b100&quot;&gt;else&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;open&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;&lt;font color=&quot;#000099&quot;&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=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#b1b100&quot;&gt;if&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;t&amp;nbsp;&lt;font color=&quot;#339933&quot;&gt;&amp;amp;&lt;/font&gt;&amp;nbsp;BIT9&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;protected&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#b1b100&quot;&gt;else&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;open&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;&lt;font color=&quot;#000099&quot;&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=&quot;#000099&quot;&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;Read&amp;nbsp;is&amp;nbsp;&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#b1b100&quot;&gt;if&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;t&amp;nbsp;&lt;font color=&quot;#339933&quot;&gt;&amp;amp;&lt;/font&gt;&amp;nbsp;BIT2&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;successful&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#b1b100&quot;&gt;else&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;failed&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;&lt;font color=&quot;#000099&quot;&gt;\n&lt;/font&gt;Write&amp;nbsp;is&amp;nbsp;&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#b1b100&quot;&gt;if&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;t&amp;nbsp;&lt;font color=&quot;#339933&quot;&gt;&amp;amp;&lt;/font&gt;&amp;nbsp;BIT3&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;successful&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#b1b100&quot;&gt;else&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;failed&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;&lt;font color=&quot;#000099&quot;&gt;\n&lt;/font&gt;Erase&amp;nbsp;is&amp;nbsp;&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#b1b100&quot;&gt;if&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;t&amp;nbsp;&lt;font color=&quot;#339933&quot;&gt;&amp;amp;&lt;/font&gt;&amp;nbsp;BIT4&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;successful&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#b1b100&quot;&gt;else&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;failed&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;&lt;font color=&quot;#000099&quot;&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#009900&quot;&gt;&amp;#125;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;font color=&quot;#993333&quot;&gt;void&lt;/font&gt;&amp;nbsp;print_control&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#009900&quot;&gt;&amp;#123;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#993333&quot;&gt;uint32_t&lt;/font&gt;&amp;nbsp;t&amp;nbsp;&lt;font color=&quot;#339933&quot;&gt;=&lt;/font&gt;&amp;nbsp;F_CCR&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;Sector&amp;nbsp;ID&amp;nbsp;1&amp;nbsp;is&amp;nbsp;&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#b1b100&quot;&gt;if&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;t&amp;nbsp;&lt;font color=&quot;#339933&quot;&gt;&amp;amp;&lt;/font&gt;&amp;nbsp;BIT23&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;write&amp;nbsp;protected&lt;font color=&quot;#000099&quot;&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#b1b100&quot;&gt;else&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;open&lt;font color=&quot;#000099&quot;&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#009900&quot;&gt;&amp;#125;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&lt;font color=&quot;#993333&quot;&gt;int&lt;/font&gt;&amp;nbsp;main&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#009900&quot;&gt;&amp;#123;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print_status&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;F_CCR&amp;nbsp;&lt;font color=&quot;#339933&quot;&gt;=&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#208080&quot;&gt;0xffffffff&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print_control&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;F_CCR&amp;nbsp;&lt;font color=&quot;#339933&quot;&gt;=&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#208080&quot;&gt;0xffffffff&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#339933&quot;&gt;^&lt;/font&gt;&amp;nbsp;BIT23&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print_control&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;Data&amp;nbsp;from&amp;nbsp;address&amp;nbsp;0x0&amp;nbsp;is&amp;nbsp;%08X&lt;font color=&quot;#000099&quot;&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;,&lt;/font&gt;&amp;nbsp;F_SECTOR1&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#0000dd&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;Writing&amp;nbsp;data&amp;nbsp;to&amp;nbsp;address&amp;nbsp;0x0...&lt;font color=&quot;#000099&quot;&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;F_SECTOR1&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#0000dd&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#339933&quot;&gt;=&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#208080&quot;&gt;0xcafebabe&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;Waiting&amp;nbsp;for&amp;nbsp;IDLE...&lt;font color=&quot;#000099&quot;&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#b1b100&quot;&gt;while&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;F_CSR&amp;nbsp;&lt;font color=&quot;#339933&quot;&gt;&amp;amp;&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#208080&quot;&gt;0x3&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print_status&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#000066&quot;&gt;printf&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#ff0000&quot;&gt;&amp;quot;Data&amp;nbsp;from&amp;nbsp;address&amp;nbsp;0x0&amp;nbsp;is&amp;nbsp;%08X&lt;font color=&quot;#000099&quot;&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;,&lt;/font&gt;&amp;nbsp;F_SECTOR1&lt;font color=&quot;#009900&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#0000dd&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#009900&quot;&gt;&amp;#41;&lt;/font&gt;&lt;font color=&quot;#339933&quot;&gt;;&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#009900&quot;&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=&quot;https://i.imgur.com/qyC6wfxl.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=1156&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://x86128.dreamwidth.org/1156.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>6</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://x86128.dreamwidth.org/840.html</guid>
  <pubDate>Mon, 06 May 2019 14:22:26 GMT</pubDate>
  <title>Обновление Memory initialization file в Quartus без пересборки проекта</title>
  <link>https://x86128.dreamwidth.org/840.html</link>
  <description>Без длительной пересборки проекта с нуля можно быстро обновить содержимое блоков памяти из командной строки:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
quartus_cdb --update_mif &quot;project name&quot;
quartus_asm &quot;project name&quot;
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;А затем выполнить загрузку:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
CABLE_NAME   ?= &quot;USB-Blaster&quot;
PROJECT_NAME ?= de10-lite

quartus_pgm -c $(CABLE_NAME) -m JTAG -o &quot;p;$(PROJECT_NAME).sof&quot;
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://www.intel.com/content/www/us/en/programmable/support/support-resources/knowledge-base/solutions/rd12062004_8707.html&quot;&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=&quot;https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=840&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://x86128.dreamwidth.org/840.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://x86128.dreamwidth.org/544.html</guid>
  <pubDate>Thu, 02 May 2019 15:33:36 GMT</pubDate>
  <title>Об обустройстве окружения в Linux</title>
  <link>https://x86128.dreamwidth.org/544.html</link>
  <description>Попалась &lt;a href=&quot;https://wiki.archlinux.org/index.php/Altera_Design_Software&quot;&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=&quot;https://imgur.com/crsJLQY&quot;&gt;&lt;img src=&quot;https://i.imgur.com/crsJLQYl.png&quot; title=&quot;source: imgur.com&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Очень важно чтобы путь установки Quartus был написан с использованием маленьких букв, иначе будут виснуть мастера IP-ядер. &lt;a href=&quot;https://www.intel.com/content/www/us/en/programmable/support/support-resources/knowledge-base/solutions/rd12062009_421.html&quot;&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=&quot;https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=544&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://x86128.dreamwidth.org/544.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://x86128.dreamwidth.org/293.html</guid>
  <pubDate>Tue, 30 Apr 2019 17:00:16 GMT</pubDate>
  <title>DE10-LITE приехала!</title>
  <link>https://x86128.dreamwidth.org/293.html</link>
  <description>Спешу поделиться радостью: прямо перед праздничными выходными почта довезла плату с FPGA Altera Max10 в исполнении Terasic de10-lite.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://i.imgur.com/45f8HBul.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Базовые хеловордлы пройдены: светодиоды, ключи, кнопки, HEX и писк через бузер освоены. Под парами лежат модули RS232 на 3.3v и модуль SD-карточек. &lt;br /&gt;&lt;br /&gt;Версия бузера у меня &lt;a href=&quot;https://robotdyn.com/buzzer-module.html&quot;&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=&quot;https://www.dreamwidth.org/tools/commentcount?user=x86128&amp;ditemid=293&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://x86128.dreamwidth.org/293.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>14</lj:reply-count>
</item>
</channel>
</rss>
