Quantcast
Channel: vinxru
Viewing all 319 articles
Browse latest View live

Контроллер SD-карты для компьютера Радио 86РК (Апогей БК01Ц)

$
0
0
Этот проект очень давно начат и много раз забрасывался. И я возвращаюсь очередной раз. Будем подключать флешку к компьютеру Радио 86РК, а точнее подключать к компьютеру микроконтроллер ATMega8 к которому подключена флешка.

Вся информация будет тут http://vk.com/topic-41468278_29998944.

А здесь кое что продублирую для поисковых роботов. И потому что этот проект состоит из программирования на 90%. А в LJ будет только программирование.

На данный момент контроллер эмулирует ПЗУ на 128 байт. Программа из этого ПЗУ загружает произвольный файл в память.

Теперь надо адаптировать SDBIOS и коммандер для Радио 86РК










Контроллер SD-карты для компьютера Апогей БК01Ц (Радио 86РК) завершен

$
0
0
Завершил SD контроллер для Апогея БК01, а так же любого Радио 86РК компьютера. Все материалы тут:

https://github.com/vinxru/86RKSD

Я подготовил файлы только для Апогея. Что бы подключить контроллер к Радио 86РК, надо лишь адреса портов и загрузки в исходниках поменять. Это я сделаю попозже, когда буду подключать контроллер.

Помимо контроллера, я написал еще оболочку. И она получилась очень даже удобной:

- Выбор файла стрелочками и запуск Enter-ом
- Две панели (клавиша TAB)
- Запуск файла с аргументами из ком строки
- Определение свободного места на карте (клавиша F1)
- Запуск внешней программы просмотра и редактирования (клавиши F2,F3,F4)
- Копирование файлов и папок с вложенными папками (5, SHIFT+5)
- Переименование и перенос файлов и папок (6, SHIFT+6)
- Использование маски при копировании и переименовании
- Создание папки (7)
- Удаление файлов и папок (8)
- Выделение группы файлов по маске (СТР, *, +, -)
- Восстановление старого пути при запуске
- Оторбражение размера, времени создания и атрибутов файла.

Командер занимает 12 Кб. Т.е. на компьютерах с памятью 16 Кб не запустится.









И благодаря контроллеру оживил Цветные Линии





Пока что не поддерживается (потому что не нужно):

1) Запуск по расширениям
2) Меню
3) Просмотр консоли (CTRL+O, CTRL+P)
4) Изменение атрибутов файлов
5) Цветной интерфейс
6) Расцветка файлов по типу
7) История выполненных команд (CTRL+E)
8) Скринсейвер
9) Поиск файла (ALT+F7)
10) Несколько режимов отображения файлов
11) Несколько видов сортировки
12) Быстрый просмотр файла (CTRL+Q)
13) Панель информации (CTRL+L)
14) Поиск в панели (ALT+имя файла)
15) Пользовательское меню (F2)
16) Просмотр содержимого архивов
17) Поддержка нескольких дисков (ALT+F1, ALT+F2)
18) Поменять панели местами (CTRL+U)
19) Команда сравнения панелей
20) Часы

Звездные Войны для Апогея БК01

$
0
0
Сделал демо Звездные Войны для Апогея БК01. Точнее портировал существующее ASCII видео на древний компьютер. Единственной сложностью было сжать 2 Мб в 48 Кб.

На этом видео демо размером 32 Кб. Подняв размер до 48 Кб и доработав архиватор, я увеличил количество кадров в 4 раза и теперь пропускается не более одного кадра. Смотреть стало интереснее, но перезаливать лень.

Скачать RKA файл
https://github.com/vinxru/86RKSD/raw/master/%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C%20%D0%BD%D0%B0%20%D1%84%D0%BB%D0%B5%D1%88%D0%BA%D1%83%20%D0%B4%D0%BB%D1%8F%20%D0%90%D0%BF%D0%BE%D0%B3%D0%B5%D1%8F/DEMO/starwars.rka

Собираем Пентагон 48 в корпусе от Дельты С

Новый проект.

$
0
0
По всем фронтам моей прошлой жизни абсолютный регресс с каждым месяцем становится всё печальнее и печальнее. Период паники или депрессии прошел, я перестал переживать по всем поводам. Пропало всякое желание, мотивация, эмоции. В голове стало просторно, чисто и спокойно. К тому же, примерно через месяц переезжаю в Питер. Это будет новая жизнь и на то, что сейчас происходит я просто не обращаю внимания.

Осталось только тяжелое и больное тело. И текущее настроение очень способствует приведению себя в норму, поскольку даже есть не хочется. Лишь такое настроение не пропало. И что бы помочь себе сохранить это настроение, я решил писать тут ход нового проекта по апгрейду своего тела.

Несколько дней назад я решил вести лог:
09-06-2014 Вес: 117.5. Питание: горошек 250г, тунец 250г, курица 100г. Велосипед -424 ккал.
10-06-2014 Вес: 117.3. Питание: горошек 250г, тунец 250г, курица 100г. Велосипед -450 ккал.
11-06-2014 Вес: 116.3. Питание: 500 грамм шашлыка + 1.5 литра пива. Совратили меня на дачную пьянку.
12-06-2014 Вес: 118.9. Питание: горошек 250г + тунец 250г + грибной суп 300г + курица 50г. Велосипед -940 ккал (1 час 14 левел)
13-06-2013 Вес: 117.6. Питание: горошек 120г. Велосипед -883 ккал (1 час 13 левел)

Кстати нормализовался сон. Раньше я спал по 4 часа ночью. Теперь сплю по 11 часов и иногда сплю днем.

(Горошек и тунец удобно упакованы в банки по 250 грамм. Их не надо готовить и после них не надо мыть посуду. А еще там много белка.)

Надо писать о программировании...

$
0
0
Сегодня дали задачку, сделать мастер для удобного выбора даты. Причем, в будущем настраиваемый пользователем. На этом мастере должна присутствовать куча кнопок соответствующая различным периодам. И при наведении мыши на период, должны подсвечиваться все периоды входящие в него. Ну то есть, при выборе года, должны подсветится все месяцы.



Просто нарисовать подобный мастер в редактор форм просто. Но когда дойдет дело до настроек, будет сложнее. Поэтому сразу делаю лаконичное описание (настройку) всех периодов и автоматический расчет положения всех кнопок.


void ToolEditPeriod::updateItems() {
  items.clear();
  
  // Интерфейс представляет собой таблицу. Первые 4 аругмента addItem, это
  // положение и размер ячейки. Далее идет рамка ячейки. Далее эффекты анимации:

  // tAutoSel - надо подсветить ячейку, если её период входит в выбранную пльзователем ячейку.
  // Т.е. когда пользователь выбирает 1 квартал, месяцы Январь, Февраль, Март будут подсвечены.

  // tOtherSel - ячейку подсвечивать не надо. Например, элемент ТЕКУЩИЙ КВАРТАЛ не будет подсвечен 
  // при выборе элемента ТЕКУЩИЙ ГОД. На экране становится слишком много подсвеченных элементов.

  // tNoSel -ячейка не участвует в анимации вообще. Её выбор никого не подсвечивает и сама она
  // не подсвечивается.

  addItem(0, 0, 5, 1, bNone, tNoSel, "Ранее").onClick = [&]() { curYear--; updateItems(); };
  int y=1;
  auto a = encodeDate(curYear,1,1);
  for(int i=0; i<3; i++) {
    addItem(0, y, 1, 4, bTop, tAutoSel, i2s(curYear+i), a, incYear(a));
    addItem(1, y, 1, 1, bTop, tAutoSel, "1 кв",    a, incMonths(a, 3)); // Можно код ниже свернуть в цикл, но так красивее
    addItem(2, y, 1, 1, bTop, tAutoSel, "Январь",  a, incMonth(a)); a=incMonth(a);
    addItem(3, y, 1, 1, bTop, tAutoSel, "Февраль", a, incMonth(a)); a=incMonth(a);
    addItem(4, y, 1, 1, bTop, tAutoSel, "Март",    a, incMonth(a)); a=incMonth(a);
    y++;
    addItem(1, y, 1, 1, bNone, tAutoSel, "2 кв",    a, incMonths(a, 3));
    addItem(2, y, 1, 1, bNone, tAutoSel, "Апрель",  a, incMonth(a)); a=incMonth(a);
    addItem(3, y, 1, 1, bNone, tAutoSel, "Май",     a, incMonth(a)); a=incMonth(a);
    addItem(4, y, 1, 1, bNone, tAutoSel, "Июнь",    a, incMonth(a)); a=incMonth(a);
    y++;
    addItem(1, y, 1, 1, bNone, tAutoSel, "3 кв",    a, incMonths(a, 3));
    addItem(2, y, 1, 1, bNone, tAutoSel, "Июль",    a, incMonth(a)); a=incMonth(a);
    addItem(3, y, 1, 1, bNone, tAutoSel, "Август",  a, incMonth(a)); a=incMonth(a);
    addItem(4, y, 1, 1, bNone, tAutoSel, "Сентябрь",a, incMonth(a)); a=incMonth(a);
    y++;
    addItem(1, y, 1, 1, bNone, tAutoSel, "4 кв",    a, incMonths(a, 3));
    addItem(2, y, 1, 1, bNone, tAutoSel, "Октябрь", a, incMonth(a)); a=incMonth(a);
    addItem(3, y, 1, 1, bNone, tAutoSel, "Ноябрь",  a, incMonth(a)); a=incMonth(a);
    addItem(4, y, 1, 1, bNone, tAutoSel, "Декабрь", a, incMonth(a)); a=incMonth(a);
    y++;
  }

  addItem(0, y, 5, 1, bTop, tNoSel, "Позднее").onClick = [&]() { curYear++; updateItems(); };

  auto d = getCurrentDate();

  addItem(5,  0, 1, 1, bLeft, tNoSel,    "Всё");
  addItem(5,  1, 1, 1, bLeft, tNoSel,    "Cегодня",              d, incDay(d));
  addItem(5,  2, 1, 1, bLeft, tNoSel,    "Вчера",                decDays(d, 1),  d);
  addItem(5,  3, 1, 1, bLeft, tNoSel,    "Вчера и сегодня",      decDays(d, 1),  incDay(d) );
  addItem(5,  4, 1, 1, bLeft, tNoSel,    "За последние 7 дней",  decDays(d, 6),  incDay(d) );
  addItem(5,  5, 1, 1, bLeft, tNoSel,    "За последние 14 дней", decDays(d, 13), incDay(d) );
  addItem(5,  6, 1, 1, bLeft, tNoSel,    "За последние 45 дней", decDays(d, 44), incDay(d) );
  addItem(5,  7, 1, 1, bLeft, tNoSel,    "За последние 90 дней", decDays(d, 89), incDay(d) );
  addItem(5,  8, 1, 1, bLeft, tOtherSel, "Текущий месяц",        roundMonth(d), incMonth(roundMonth(d)));
  addItem(5,  9, 1, 1, bLeft, tOtherSel, "Текущий квартал",      roundMonth3(d), incMonths(roundMonth3(d), 3));
  addItem(5, 10, 1, 1, bLeft, tOtherSel, "Текущий год",          roundYear(d), incYear(roundYear(d)));  
  addItem(5, 11, 1, 1, bLeft, tOtherSel, "Прошлый месяц",        incMonths(roundMonth(d), -1), roundMonth(d));
  addItem(5, 12, 1, 1, bLeft, tOtherSel, "Прошлый квартал",      incMonths(roundMonth3(d), -3), roundMonth3(d));
  addItem(5, 13, 1, 1, bLeft, tOtherSel, "Прошлый год",          incMonths(roundYear(d), -12), roundYear(d));

  prepareItems();
}

//-----------------------------------------------------------------------------
// В конструкторе только лишь инициализируем переменные, так как 
// при исключении в конструкторе, дестрактор не вызывается.

ToolEditPeriod::ToolEditPeriod() {
  hover = 0;  
  curYear = 0;
}

//-----------------------------------------------------------------------------
// Создание окна

void ToolEditPeriod::create(int wx, int wy, const std::function<void(DateTime, DateTime)>& _onSelect) {
  // Сохраняем переменные
  onSelect = _onSelect;

  // Отображаемый в мастере год. Пользователь может его изменить в процессе работы
  curYear = getCurrentDate().y()-1;

  // Создаем окно верхнего уровня без рамки. И сразу не показываем, а то оно заберет
  // фокус у поля ввода, для которого этот мастер вызывается
  createTop(wx, wy, 16, 16, "", bsTopmost|bsTool|bsHidden);

  // Окно будет автоматически скрыто, если пользователь кликнет мимо, изменит фокус 
  // или интерфейс изменится.
  hideToolWindow_start0(this, /*canClickSelf=*/true);

  // Инициализируем интерфейс
  updateItems();
}


Интерфейс описан как таблица. Пока этого хватает и выглядит симпатично. Но если придется переделать, то метод addItem будет просто принимать вместо координат ячеек, координаты пикселей.

Ну а пока, таблица позволяет точно подогнать размер окна и ячеек под размер шрифта. Это делает метод prepare:

void ToolEditPeriod::prepareItems() {
  // Оступы
  const int padding = 32;
  const int borderSize = 1;
  const int lineHeight = stdFont.height + 8;

  // Определение ширины каждого столбца
  vector<int> columns;
  int rowsCount = 0;
  DCDisplay dc;
  for(auto& i : items) {
    int tw = (stdFont.width(dc, i.text) + padding) / i.w;
    for(int j=i.w, c=i.x; j; --j, ++c) {
      if(c >= columns.size()) columns.push_back(tw);
                         else setMax(columns[c], tw);
    }
    setMax(rowsCount, i.y+i.h);
  }

  // Расчет положения и размера ячеек
  for(auto& i : items) {
    i.gx = borderSize;
    for(int j=0; j<i.x; j++)
      i.gx += columns[j];
    i.gx1 = i.gx - 1;
    for(int j=0; j<i.w; j++)
      i.gx1 += columns[i.x + j];
    i.gy = borderSize + i.y * lineHeight;
    i.gy1 = i.gy + i.h * lineHeight - 1;
  }

  // Определение и изменение ширины окна
  int totalWidth = borderSize * 2;
  for(auto w : columns)
    totalWidth += w;
  resizeClient(totalWidth, borderSize * 2 + rowsCount*lineHeight);
  invalidate();

  // При первом запуске метода prepareItems окно будет отображено. Причем
  // фокуса это окно не получит.
  show(swShowNa);
}


Функция вывода на экран и обслуживании мыши крайне проста. Но функция вывода будет рашсирена.

void ToolEditPeriod::redraw(DC& dc) {
  // Белый фон и серая рамка
  dc.clear(0xFFFFFF);
  dc.rect(0,0,clientWidth-1,clientHeight-1,1,0x808080);  
  
  for(auto& i : items) {    
    // Подсвечиваем ячейку. Логичка подсветки описана выше
    if(hover==&i || (hover && hover->selType!=tNoSel && i.selType==tAutoSel && hover->f <= i.f && hover->t >= i.t))
      dc.vertGradient(i.gx, i.gy, i.gx1, i.gy1, CURSOR_BKGND1, CURSOR_BKGND2);
    // Текст ячейки выводим по центру
    dc.text2(DT_CENTER|DT_VCENTER, i.gx, i.gy, i.gx1, i.gy1, stdFont, 0, i.text);
    // Рамка ячейки
    if(i.borderType & bLeft) dc.line(i.gx, i.gy, i.gx, i.gy1, 1, 0x808080);
    if(i.borderType & bTop) dc.line(i.gx, i.gy, i.gx1, i.gy, 1, 0x808080);
  }
}
//-----------------------------------------------------------------------------
// Поиск ячейки по координатам

ToolEditPeriod::Item* ToolEditPeriod::findItem(int x, int y) {
  for(auto& i : items)
    if(x>=i.gx && y>=i.gy && x<=i.gx1 && y<=i.gy1)
      return &i;
  return 0;
}

//-----------------------------------------------------------------------------
// Перемещение мыши над объектом

void ToolEditPeriod::wmMouseMove(short x, short y, int keys) {
  // Если клавиша мыши нажата, но не обрабатываем перемещение мыши
  if(getCaptured()) return;
  // Если курсор уже над другой ячейкой, перериосываем интерфейс
  auto hover1 = findItem(x, y);
  if(hover != hover1) {
    hover = hover1; 
    invalidate();
  }
}

//-----------------------------------------------------------------------------
// Ячейка под курсором у нас всегда отмечена, поэтому если курсор вышел за 
// переделы нашего окна, надо снять подсветку.

void ToolEditPeriod::wmMouseLeave() {
  wmMouseMove(-1, -1, 0);
}

//-----------------------------------------------------------------------------
// Клик мышью

void ToolEditPeriod::wmLButtonDown(short x, short y, int keys) {  
  hover = findItem(x, y);
  if(hover) setCaptured(true);
  invalidate();
}

//-----------------------------------------------------------------------------
// Клик мышью не должен отбирать фокус

int ToolEditPeriod::wmMouseActivate(HWND,int,unsigned int) {
  return maNoActivate; 
}

//-----------------------------------------------------------------------------
// Пользователь отпустил кнопку мыши

void ToolEditPeriod::wmLButtonUp(short x, short y, int keys) {
  auto hover1 = hover;

  // Перерисовываем в любом случае
  invalidate();

  // Освобождаем курсор. Ну а если мы его не захватывали, то просто выходим
  if(!getCaptured()) return;
  releaseCapture();

  // Если пользователь убрал мышь с ячейки после нажатия, то выходим
  if(hover1==0 || findItem(x, y) != hover1) return;

  // Эта ячейка имеет свой обрботчик нажатия
  if(hover1->onClick) { hover1->onClick(); return; }

  // Возвращаем результат
  auto t = hover1->t;
  if(t != emptyDateTime) t = decDay(t);
  if(onSelect) onSelect(hover1->f, t);

  // Закрываем окно
  wmClose();
}

//-----------------------------------------------------------------------------
// Закрываем окно

void ToolEditPeriod::wmClose() {
  destroy();
  deleteIdle();
}


Ну и заголовочный файл

class ToolEditPeriod : public Window {
  enum SelType { tAutoSel, tOtherSel, tNoSel };
  enum BorderType { bNone=0, bLeft=1, bTop=2 };

  class Item {
  public:
    int x, y, w, h;
    int gx, gy, gx1, gy1;
    BorderType borderType;
    SelType selType;
    string text;
    DateTime f, t;
    std::function<void()> onClick;
  };

  list<Item> items;
  Item* hover;  
  int curYear;
  std::function<void(DateTime, DateTime)> onSelect;

  void updateItems();
  void prepareItems();
  Item* findItem(int x, int y);
  Item& addItem(int x, int y, int w, int h, BorderType borderType, SelType selType, cstring text, DateTime f=emptyDateTime, DateTime t=emptyDateTime);  

  // Сообщения Windows
  void redraw(DC& dc);
  void wmClose();
  void wmLButtonDown(short x, short y, int keys);
  void wmLButtonUp(short x, short y, int keys);
  void wmMouseMove(short x, short y, int keys);  
  int  wmMouseActivate(HWND,int,unsigned int);
  void wmMouseLeave();

public:
  ToolEditPeriod();
  void create(int x, int y, const std::function<void(DateTime, DateTime)>& onSelect);
  ~ToolEditPeriod();
};

Продолжаем худеть.

$
0
0
Целый месяц был в отпуске. На машине сьездили на юг - Рязань, Новороссийск, Абинск, Геленджик, Шебекино, Белгород, Керч, Ярославль и кучу городов проездом. Худеть в отпуске не получается. Первую неделю посылал всех в жопу, получил по морде разок, выслушал кто я такой, начал и закончил курить. На сытый желудок терпеть окружающую дествительность гораздо проще, и что бы меня не оставили в 3000 км от дома без документов и паспорта пришлось начать нормально есть. Но теперь отпуск кончился, возращаемся к депресняку. Начинаем с отметки 116 кг. Чудо, но за месяц я почти не поправился. Потому что все время куда то ходил.

А еще прочитал книжку Карнеги - Как стать пофигистом.

Учебник по пофигизму написанный Карнеги до боли напоминает книгу "Как бросить курить"Аллена Карра. Аллен Карр кстати умер от рака легких... Я решил посмотреть, как же умер Карнеги. Карнеги покончил жизнь самоубийством от депресии. Такие дела. Это все можно выразить поговоркой - сапожник без сапог.

Благодарность


Вообще, некоторые советы дельные. И с точки программиста, то есть меня, абсолютно логичные. Вот например - благодарность.

Никогда не делайте ничего, ожидая в замен благорадности. И не ждите благодарности, даже от собственых детей.

Не получив благодарности, вы себе тоьлко испортите настроение. А получив, вы отнесетесь к этому, как к само сбой разумеющемуся. Как к зарплате на работе.

Благодарности нет в прирове человека, нет в его геноме. Это лишь воспитение. Это лишь программа поведения заложенная родителями.

Хотите получить признание человека - берите вперед. "Вечером деньги, утром стулья". Пусть постараются вас уговорить - это тешит тчестлание не меньше благодарности.

Во вторых, благодарность на хлеб не намажешь.

Не стоит ничего делать, даже для жены и детей, ожидая что она, они тебя будут обожествлять. Задай себе вопрос - чего ты хочешь получить в замен. И только получив ответ - ничего, делай. Иначе только расстроишься.

Никогда не делай ничего, ожидая что то в замен потом.

Там даже Библию (для верующих) приводят в пример. Только один из всех исцеленных Иисусом вернулся и поблагодарил. А ты, сволочь, думаешь, что лучше Иисуса?

Общий отдых


Еще мысль про совместный отдых.

- Это будет семейный отдых с друзьями, мы будем то что нам нравится делать вместе, получать убовольствие и смеяться.

Это было враньё, по крайней мере в том смысле, в каком я понял эту мысль. Интересы каждого человека различны. Планирование такого отпуска - это конкуренция интересов всех участников. Все собрались на кухне и стали переубеждать друг друга, как правильнее сделать.

Ну а я чинил в это время дверь в туалет. Двери как бы и не было. Чинить нужник было исключительно моё решение, о котором меня никто не просил. Это ошибка, которую я совершаю постоянно. НИКОГДА НЕ ДЕЛАЙТЕ ТОГО, ЧЕГО ВАС НЕ ПРОСИЛИ.

Остальные даже звать меня на совещание не стали и всё решили без меня. Так проще.

Хочешь хорошо отдохнуть - думай в первую очередь о себе. Ну а остальные подтянутся если ваши интересы совпадут. Пытаться заставить других делать то, что инетресно тебе, ради всех, бессмысленно. С точки зрения пофигизма, бессмысленно вдвойне. Пытаться заставить кого то думать о тебе, это испортить отпуск этому человеку. У него свои планы.

- Давай те хоть карты купим или удочки возьмем, чем мы там заниматсья будем?
- Отстань ты, на месте разберемся.
- Там мы не сможем купить карты.
- Ну и всё, мы уже всё решили.

Надо было пойти и купить. И вообще, придумать занятие для себя заранее. В итоге - делать нечего. Сижу один. И мне все говорят - что я своим настроением испортил всем отпуск. Всем как бы пофиг, что отпуск испорчен мне в первую очередь.

Никто не поставит ваши интересы, выше своих. Хотите хорошо провести отпуск - деритесь за это. Вас пошлют нафиг - орнизуйте свой отпуск с преферансом и дамами (с) Бендер. Одному проводить отпуск лучше, чем в депресии, выслушивая постоянные упреки откружающих.

Думать, что ехать надо, потому что окрущающим для полного счастья не хватает моей довольной хари под боком - не правильно. Поехать то я поеду, но довольной хари не будет.

Вчера уже не существует, завтра еще не существует.


Самая сложная мысль, но вполне логичная. Будущего нет. Отпуск кончается через неделю... что я должен об этом думать, что я должен чуствовать?

Этого еще не случилось и может не случится. Я могу остаться еще на неделю, я в силах это сделать. Почему то, что произойдет в будущем, должно влиять на настоящее. Это нарушает причинно-следственую связь, это даже в физике не возможно. События будущего не влияют на события настоящего.

Будущего нет. И противоположная мысль, только портит настоящее. Завтра будет лучше, значит сегодня плохо. Завтра будет хуже, значит есть повод расстроится.

Через неделю - это значит, что этого не было. Не отпуск кончается через неделю. А еще не было такого, что бы отпуск кончился.

То же и с прошлым. Прошлое уже мертво. Как сьеденый шашлык, оно уже превратилось в фекалии. И эти фекалии не должны влиять на настроение. Если вчера было хорошо, значит сегодня плохо. Если вчера было плохо, это повод расстроится.

Сложно и кажется невозможно, не вспоминать и не планировать. Но настоящий пофигист никогда не думает о завтрешнем дне и не живет в прошлом. Планируйте ближайший час.

Нельзя ждать будущего. Например, нельзя ждать выходных, потому что рабочие дни станул унылыми и жизнь проплывет мимо вас.

Хочешь стать пофигистом, придется научится забыть о понятиях вчера и завтра.

Это кстати первая глава книги "ЖИВИТЕ В «ОТСЕКЕ» СЕГОДНЯШНЕГО ДНЯ".

Но все же Карнеги пишет фигню, все кто у него впадает в депрессию сильно худеют. Суровая реальность говорит об обратном, все начинают безмерно жрать.

Работа


А самая главная мысль - про работу. У тебя есть директор, который решает, что ты будешь делать и сколько тебе заплатить. Даже если ты разрабатываешь термоядерный реактор и он нифига не рабоатет, это не твоя проблема. Директор дав тебе денег, отдавал себе отчет обо всех рисках и пусть переживает он.

От вас только требуется закончить работату. Переживания делу не помогут. Ну а отсутствие результата - то же результат. Любой ученый подтвердит.

И еще есть более глобальная мысль, которую обосновывать лень. Решил, что то сделать - делай и не думай о последствиях. У тебя уже было время подумать, когда ты все планировал. Лишние мысли во время работы, только испортят четкий и понятный план действий.

Замахнулся, бей.

Делай только то, что хочется или решил делать сам


Еще одна заповедь пофигиста: «Никогда не делайте ничего того, чего вам не хочется».

И мысль эта более глобальна, чем кажется на первый вгляд. Это не только отказ от повседневных обязанностей. Это отказ от стереотипного поведения и стереотипого мышления. Гадость уже случилась, но хочется ли вам из за этого расстраиваться? Нет. Только испортишь несколько часов жизни.

Стать пофигистом прочитав книгу и зазубрив все заповеди невозможно. Наши эмоции формируют наши мысли, которые формурет окрущающая действительность. Только изменив действительность, можно изменить мысли и настроение.

Надо исключить причины расстройств. Одна из таких причин: "Я все это делаю из за вас, мне это не нравится, вы все виноваты".

Можно даже перерезать себе вены, думая, что делаешь это ради кого то. Из мести, например. Если человек имеет возможность делать все, что ему хочется. И делает только то, что ему хочется, то кого же он может обвинять? За что он должен мстить?

Если делать ничего не хочется, не делайте. Это просто. Хочешь, расстраивайся, хочешь не расстраивайся. Хочешь ешь, не хочешь не ешь. Хочешь, иди, хочешь, беги.

Это твой выбор, никто не вправе тебе указывать.

Ну и пофиг


У многих людей есть проблемы, которые они пытаются решить годами. Или много лет пытаются вернуть что то, что было в их прошлом и расстраиваются.

Очередная заповедь пофигиста: это не изменить.

Например, оторвало у вас палец. Что вы сможете с этим сделать? Ничего. Любые мысли по этому поводу делу не помогут. Перестали расти волосы? Ну и фиг с ними. Ушла жена и вы несколько лет пытаетесь её вернуть? Ну и фиг с ней. Это всё даже не проблемы. А так, переживания на пустом месте.

Наверное нет такой серьзеной потери в жизни, что бы стоило переживать об этом.

Даже если у вас нет ноги, вы можете стать паралипийсмим чемпионом. Даже если вас полностью парализовало, вы можете получить нобелевскую премию. Даже если у вас друзья козлы, можно найти новых. Хочется секса, проститутка стоит дешевле жены. Я отвечаю. У вас не может быть детей? А и не появятся, если сидеть и переживать.

Умер муж и оставил вам 500000 рублей по страховке? Радуйтесь.

Нет смысла переживать о том, что нельзя исправить. Даже если теоритически исправить можно, но уже много лет не получается, надо забить.

Если вам говорят: "Завтра все будет по другому!", не надо ждать завтра. Это перечеркнет сегодняшний день. Сегодня надо забить и забыть. Ну а если завтра будет лучше, это будет отличный повод порадоваться.

Бессоница


И еще мысль про бессоницу из той же книги. Не можешь уснуть - проведи это время с пользой!!!

От бессоницы еще никто не умер. Всё это байки.

Видео



Я не делаю компьютеры и не снимаю видео, потому что думаю - через неделю важное событие. Я не успею. И т.п.

Но завтра не существует. Надо максимально хорошо прожить сегодняшний день и заниматься сегодня тем, что тебе нравится.

Ретропрограммирование - Кособан

$
0
0
Написал игру для компьюотера Апогей БК01Ц. Это 8 битный процессор 1.7 МГц, конечно же КР580ВМ80А. Аж 56 Килобайт ОЗУ. В качестве видео трудится КР580ВГ75, из последних сил выжимая из себя разрешение 192x104 и 8 цветов. И это не преувеличение, так как процессор тормозится раза в два. И за роялем сидит трехканальный таймер КР580ВИ53.



Скачать kosoban.rka

Питер.

$
0
0
Я переехал в Питер. Мы поменяли две гигантские видовые квартиры в Архангельске на новостройку в Питере. Плюс еще ипотеку взяли. Квартира недалеко от метро Фрунзенская. Я лично считаю, что это центр Питера, и никто меня в этом не переубедит. :) Ремонт квартиры заканчивается в этом году и Питер станет для меня домом. Но пока этого не чувствуется. Город я знаю, я учился в Питере, я работал удаленно в Питерской фирме 8 лет.

В фирме кстати стабильный регресс. В течении 3-х лет с каждым месяцем всё печальнее и печальнее. Я даже шутку придумал: Я работаю программистом-супер-марио. Извини Марио, но твоя зарплата опять не в этом месяце. (Но эту проблему решить просто, я же в Питер переехал. А в остальном всё хорошо).

Поэтому я буду писать тут о своей работе, я уже об этом говорил. А делаю я сейчас реально крутые вещи, надеюсь они послужат моим резюме. Добавим юмора, сарказма.

Ну еще ретро компьютерами разбавлю... и столярными работами :) Я себе купил фрезер (и т.п.) и собираюсь заняться изготовлением мебели из натурального дерева в классическом стиле. Ну не покупать же шкаф, за 100 тыс. Это моя 3-х месячная зарплата (из расчета последних поступлений). За 3 месяца я со шкафом точно справлюсь. А может, я вообще сменю специализацию и стану столяром. А может займусь умными домами.





Еще заканчивается платный аккаунт LJ. Продлевать я его не собираюсь. Интересно только, пропадут ли картинки из фотоальбомов?

Кружок технической кибернетики

$
0
0
Это моя первая книга по цифровой электронике и программированию. В первой половине книги описано, как по правилам оборудовать радиокружок. И как на этом сэкономить. Например, конус вытяжки можно сделать из крышки советского ТВ. Я это ни разу не читал. Скукотень. Интересное со второй половины книги.




На развороте книги были нарисованы цоколевки всех основных микросхем. Я смотрел на них много-много раз, так что эта синяя страница навсегда поселилась в моей голове.

Эти микросхемы в моей молодости стоили не дорого. Мне очень нравилась микросхема К155ИД3. Она была в 3 раза больше других микросхем, солидная такая, а стоила так же как К155ЛА3. На ИД3 можно было собрать "бегущие огни"на 16 светодиодов. Интересно... Сейчас держа микросхемы К155ЛА3, К155ИД3 в руках я испытываю не меньший трепет, чем тогда.



Книга эта о цифровой электронике. В книге все очень доходчиво разжевано, даже для дошкольника. И примеры интересные. Вот это аппарат для чтения индексов с конвертов. Самое интересное, что я понимал, как оно все работает. Цифровая техника - это просто.

Из нижней схемы я узнал, что есть чудо микросхема К142ЕН5В. Она позволяла из любого напряжения получать 5 Вольт.

Очень интересно было переводить логические схемы в формулы, упрощать формулы, а потом по ним строить схемы.



Тут описана конструкция игры "Ход ферзем", в которую нельзя выиграть. На игре даже нет табло "Вы выиграли". :)



А это игра "в спички". Тут то же нельзя выиграть. Заметте, что собрана она на диодах и тиристорах.

Я 10 лет назад переписал эту игру на чистом HTML-е, без JS. Описал все состояния игры как отдельные страницы и переходы между ними. И поспорил с человеком, что смогу написать игу на чистом HTML, без JS. И выиграл пиво :)



А это первая программа, которую я ввел в компьютер Искра 1080 Тарту.
(Не считая примитивнейших программ из книги, которая шла с компьютером).

Команды CALL, PRINT #1, DIM A(10, 10) не поддерживались... Но все работало отлично и без них.



А были схемы, которые работали от 220 Вольт! Даже думать было страшно про такое.

Справа схему на К155ИД3 я собирал. Потом прикрутил к ней счетчик К155ИЕ5, генератор на К155ЛА3 и получил "бегущие огни".



Все становилось немножечко сложнее, когда появлялись триггеры и обратные связи. Для любителей ретро, так же приведены аналогичные схемы на реле :)

Эх, люблю я автоматику на реле. Как только найду 400 реле, сделаю процессор на реле. Я уже схему в эмуляторе нарисовал.



Я недавно купил сканер и после нового года собираюсь перевести эту книгу в DJVU.

Преобразование UTF8 в UTF16 средствами C++

$
0
0
Они всётаки сделали это! Не прошло и 20 лет.

// Это надо написать где то среди глобальных переменных
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter_utf8_utf16;
// Преобразование туда
utf8 = converter_utf8_utf16.to_bytes(utf16); 
// Преобразование обратно
utf16 = converter_utf8_utf16.from_bytes(utf8);


Но новая версия Visual C++ ругается на отсутствие файла time.inl, а старая не понимает этого. Поэтому я буду по старинке исопльзовать

void fromUtf8(std::wstring& out, const char* utf8) {
  out.resize(MultiByteToWideChar(CP_UTF8, 0, utf8, -1, 0, 0));
  MultiByteToWideChar(CP_UTF8, 0, utf8, -1, const_cast(out.c_str()), out.size());
}

void toUtf8(std::string& out, const wchar_t* src) {
  out.resize(WideCharToMultiByte(CP_UTF8, 0, src, -1, 0, 0, 0, 0));
  WideCharToMultiByte(CP_UTF8, 0, src, -1, const_cast(out.c_str()), out.size(), 0, 0);
}


Можно конечно возразить, это не кроссплатформенно. Но если потребуется Linux, то написать еще два вараинта функций с использованием iconv не сложно. Но, почему бы не использовать стандартные средства ОС?

Вот тот же пример, кодирование PNG файлов. Зачем мне использовать сторонние библиотеки, если можно использовать часть операционной системы (GDI+)? Надо будет под Линукс делать, я буду использовать libpng.

Вообще, спорный вопрос...

SD-контроллер для Микро-80

$
0
0
Список поддерживаемых компьютеров пополнился еще одним экземпляром. Vlad6502адаптировал SD-контроллер Радио 86РК для Микро-80.

Прошивка контроллера остается без изменений. Для запуска нужны специальные версии файлов sdbios.rk, boot.rk, shell.rk, которые записываются на флешку. А так же требуется специальная прошивка ПЗУ компьютера (с исправленными ошибками и совместимая с 86РК). Всё это спрашивайте у Влада.

Я вот думаю к Львову ПК-01 прикрутить SD-контроллер. (Да, я в курсе, что в Львове бандеровцы живут и т.п. Пожалуйста, не будем поднимать эту тему. Делали компьютер советские люди. Я занимаюсь советскими компьютерами. Вот и весь ответ.)








Кособан для Апогей БК-01Ц

$
0
0
Новость старая, но почему то я тут её не разместил. Я написал игру и думал поучаствовать с ней на DiHalt, Chaos Constructions, 3BM или в подобном демопати. Но не получилось. В следующем году постараюсь не только поучаствовать, но и придти лично. Эти мероприятия ведь (теперь) в моем городе проводятся.

Я написал игру для компьютера Апогей БК01Ц. В компьютере стоит 8 битный процессор КР580ВМ80А на частоте 1.7 МГц. Аж 56 Килобайт ОЗУ. В качестве видео трудится КР580ВГ75, из последних сил выжимая из себя разрешение 384x208 и 8 цветов. И это не преувеличение, так как процессор тормозится раза в два. И за роялем сидит трехканальный таймер КР580ВИ53.

Скачать kosoban.rka

Кто бы мог подумать, что КР580ВГ75 способен на такое. Ну и КР580ВИ53 можно спутать с AY.

Первое знакомство с Андройдом

$
0
0
Да, прав был тот человек, который сказал, что закопаюсь на второстепенных вещах. А я думал, за день горы сверну.

Поставил себе NetBeans, Android SDK и еще десяток вспомогательных программ. NetBeans при запуске радостно съел 800 Мб ОЗУ. Это же только текстовый редактор! Это я еще компилировать и эмулировать не начал. Java одним словом.

Нашел в Яндексе пример, как надо писать Крестики-Нолики под Андройд. Написал, только по своему. Раз в 5 короче. В частности кусок проверяющий, кто выиграл. Зачем писать длиннее, я не понимаю. Если же так надо в ООП, тогда я не понимаю ООП :)

        boolean winHorz = true, winVert = true, winSlash = true, winDiv = true;
        for(int i=0; i<playFieldSize; i++) {
           if(playfield[i][y] != activePlayer) winHorz = false;
           if(playfield[x][i] != activePlayer) winVert = false;
           if(playfield[i][i] != activePlayer) winSlash = false;
           if(playfield[playFieldSize-i-1][i] != activePlayer) winDiv = false;
        }
        if(winHorz || winVert || winSlash || winDiv) {


Думаю Арканойд графический написать, крестики-нолики совсем уж примитивно.

В эмуляторе отлаживать можно. Но всё тормозит, масштаб интерфейса не чувствуется. Разрешение у компьютера и телефона нынче одинаковое. Тачпада нет. Короче не то.

Потом решил подключить совoй телефон FLY. За 4 часа поисков драйвера в интернете я ничего не нашел рабочего. Подключил планшет Леново. Это тот который глючит с момента покупки в Эльдорадо. Причем Эльдорадо отказало мне в возврате, так как нашло ржавчину в разъеме USB-провода. Еще экран у него треснул, поэтому часть сенсорного экрана не работает. Пофиг, лишь бы запустило. Дак оно не запускает! при загрузке программы выдает "Устройство работает не правильно". Лишь один раз программа запустилась.

Думаю разобрать планшет и посмотреть. Впаять USB провод намертво.

Что то мне подсказывает, что для разработки на iPad, то же потребуется iPad. Интересно, разорится ли фирма на покупку планшета под это дело? сам я покупать его не собираюсь.

P.S. Прочитал статью, как ускорить работу с SQL в Android. Предложенное решение меня повеселило - переписать всё на C++.

public class MainActivity extends Activity {
    final int playFieldSize = 3;       
    Button[][] buttons;
    int[][] playfield;
    int activePlayer;
    int step;
    
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        playfield = new int[playFieldSize][playFieldSize];                
        initInterface();
        resetGame();
    }
    
    private void resetGame() {    
        for(int y=0; y<playFieldSize; y++) {
            for(int x=0; x<playFieldSize; x++) {
                playfield[x][y] = 0;
                interfaceUpdateCell(x,y);
            }
        }
        activePlayer = 1;
        step = 0;
    }

    private void buttonClick(int x, int y) {
        if(playfield[x][y] != 0) return;
        playfield[x][y] = activePlayer;
        interfaceUpdateCell(x,y);
        step++;

        boolean winHorz = true, winVert = true, winSlash = true, winDiv = true;
        for(int i=0; i<playFieldSize; i++) {
           if(playfield[i][y] != activePlayer) winHorz = false;
           if(playfield[x][i] != activePlayer) winVert = false;
           if(playfield[i][i] != activePlayer) winSlash = false;
           if(playfield[playFieldSize-i-1][i] != activePlayer) winDiv = false;
        }
        if(winHorz || winVert || winSlash || winDiv || step==playFieldSize*playFieldSize) {
            Toast toast = Toast.makeText(getApplicationContext(), "Game over", Toast.LENGTH_SHORT);
            // Х.з. где этот гравити лежит toast.setGravity(Gravity.CENTER, 0, 0);
            toast.show();
            resetGame();
        }
            
        activePlayer = 3 - activePlayer;
    }
    
    private class ButtonClickListener implements View.OnClickListener {
        int x, y;
        public ButtonClickListener(int _x, int _y) { x = _x; y = _y; }
        public void onClick(View view) { buttonClick(x, y); }
    }
    
    private void initInterface() {
        setContentView(R.layout.main);        
        TableLayout layout = (TableLayout)findViewById(R.id.main_l);
        buttons = new Button[playFieldSize][playFieldSize];
        for (int y = 0; y < playFieldSize; y++) {
            TableRow row = new TableRow(this); // создание строки таблицы
            for (int x = 0; x < playFieldSize; x++) {
                Button button = new Button(this);
                buttons[x][y] = button;
                button.setOnClickListener(new ButtonClickListener(x,y));
                row.addView(button, new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
                button.setWidth(107);
                button.setHeight(107);
            }
            layout.addView(row, new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, TableLayout.LayoutParams.WRAP_CONTENT));
        }
    }

    private void interfaceUpdateCell(int x, int y) {
        int t = playfield[x][y];
        buttons[x][y].setText(t==0 ? "" : (t==1 ? "X" : "O"));
    }    
}


UPD: Перепаял USB разъем в планшете, заработало.

Стандартные профили для светодиодов.

$
0
0
В прошлой квартире делая подсветку на кухне я просто приклеил светодиодную ленту к шкафу. Светодиодная лента тогда была новинкой (по крайней мере для меня и моих знакомых) и ни каких специальных профилей для лент мы не знали. Лента и так смотрелась хорошо.

Сейчас же я захотел спрятать всё в профиль. Зачем? Во первых, под сушилкой для посуды нет вообще места, что бы приклеится. А во вторых, фиг его знает и наклеенная лента ни чем не хуже.

Заехал в МиниМакс, но там остался последний профиль. Я покрутил его в руках, обычная алюминька. Позрачная или матовая крышка продается за отдельные деньги и по сути не нужна (мне).

Дальше меня занесло в строительный магазин и я увидел почти такие же алюминиевые профили значительно дешевле. Ну и купил попробовать.



Для специальных профилей продаются защелки. Которые крепятся на шурупы, а в эти защелки вставляется профиль. Я же сделал проще (конструкцию) и ИМХО в итоге она даже лучше смотрится. Пофиль плотно прижат к шкафу

(Сверлить профиль - для человека без инструметов может быть не простой задачей. Вот и повод купить специальный профиль.)



И кстати, распилить можно было под углом 23", что бы профили красиво стыковались. Сразу я об этом не подумал. Ну и не страшно, что бы эту щель увидеть, надо очень сильно согнуться и засунуть голову под шкаф, не забыв налобный фонарик.

В живую конечно видно, что светятся отдельные светодиоды. Но не так, как на обычной ленте. Алюминька рассеивает и отражает свет.

Интересный конус света получился на стене. Мне даже нравится. Предметы вне светового конуса то же хорошо и равномерно освещаются. Такой конус для некоторых применений может быть и недостатоком. Без профиля угол у светодиодов гораздо шире (кажется, что почти 180 градусов).


Вот такая красота. Я купил тепло-белые светодиоды. Мне кажется, что они как то не равномерно светят. Под прямым углом лучи белее. Чем угол больше, чем желтее.



Еще поворчу про цветопередачу. В вытяжке (слева) стоит обычная галогеновая лампа. Если бы её цвет был желтее-краснее или синее-голубее, то я бы пожаловался на цетовую температуру. Но у светодиодов цвет более зеленый, а у галогенки более фиолетовый. Зеленый - центральная часть спектра! Они там совсем люминофор не проверяют, что подешевле, то и используют? Но это слабо заметно.

Конец эры Компактных Люминесцентных Ламп.

$
0
0
Когда я покупал лампы для светильников, я полагаясь на свой опыт трехлетный давности купил КЛЛ лампы. Светодиодные лампы тогда стоили дорого и/или светили тускло. Причем, найти нужное количество КЛЛ ламп с нужным цоколем и цветовой температурой не получилось и я взял 4 светодиодные лампы. Стоили они столько же. Посмотрю за одно, до чего дошел прогресс.

И прогресс дошел! Они светят в 6 раз ярче. Мне очень понравилось и пришлось раскошелиться на замену ламп.

На верхнем фото 3 лампы справа уже заменил. На нижнем заменил все. По ощущениям светит в 3 раза ярче, при том что потребляет в 2 раза меньше энергии. Всё, эра КЛЛ закончилась!



На верхнем фото из 4-х КЛЛ ламп одна за месяц успела сломаться. (К.О. на всякий случай поясняет, что в кадр попали только две лампы. Автор не располагает объективом рыбий глаз.) На нижнем заменил все. Я стал видеть, что вокруг!



Ну и лампочки:
1) UNIEL 7W 2800K 50mA 230V 50/60Hz ESL-JCDR-7/2800/GU5.3/A Made in P.R.C
2) Ecola LED 4.2W 2800K 220(+-20)V 50-60Hz 34mA



Такое ощущение, что цветовая температура светодиодной лампы не 2800K, а где то 3400K. Может быть, это из за яркости.

UPD:

Сравнил спектры КЛЛ (сверху) и светодиодных ламп (снизу). На спектре КЛЛ видно. У фотоаппарата засвет в красной области, отсутствие светло зеленого, отсутствие голубого, отсутствие светло-синего.

Спектр светодиодной лампы можно печатать в учебниках по физике как образец.

Такие дела.

Компьютерный стол в классическом стиле (или кантри, или что то типа того)

$
0
0
Изготовление этого стола заняло 4 полудня.

Издали выглядит так как хотелось, но вблизи и внутри немного не то. Не так краска легла, не тот цвет получился, не такой ширины зазоры получились, кое где шероховато. В следующий раз будет лучше. В голове миллионы мыслей про то как надо делать, про то как не надо.

Материалов потрачено на 2200 руб (30 евро). И теперь у меня есть место, где работать. Да, компьютер теперь то же хочется белый. И еще добавлю полочку под бесперебойник.

Направляющие для ящиков я сделал самый простые. К ящику прикрутил алюминиевый швеллер (который без бела валялся в углу). А к столу прикрутил дощечку с пазом. Швеллер вставляется и двигается в пазу. Выдвигается ящик само собой не до конца, иначе ящик выпадет.

У меня в одном из ящиков лежит сканер. Неплохо было бы, что бы сканер прямо в ящике работал. Но ящик настолько не выдвигается, что бы можно было пользоваться сканером. Когда буду делать новый стол, разорюсь на подшипниковые направляющие полного выдвижения.















Пока что лучший способ финишной отделки сосны.

$
0
0
Поставив кучу экспериментов, нашел (пока что) лучший способ избавиться от рельефа сосны. Первый слой - клей ПВА, наждачка, второй слой - краска, наждачкой полностью стираем краску, третий слой - краска. Прозрачный акриловый лак повел себя чуть хуже клея ПВА.



Стол я делал по формуле: 1 слой - краска, минимум наждачки, 2 слой - краска, 3 слой - лак, 4 слой - лак.



Еще бы найти не вонючий, быстросохнущий, прочный как эпоксидная смола лак. :) Стеллаж покрашенный алкидной краской всё еще воняет.




Доработал способ финишной обработки сосны. Никакого рельефа, идеально гладкая, красивый белый цвет, передается текстура дерева, матовый, не смачивается водой.

Добавил к прошлому способу два слоя лака (Bosny White). Он очень текучий, быстросохнущий, первый слой моментально впитывается в дерево. Краска становится прозрачнее, надо это учитывать. Второй слой образует тонкную матовую пленку.

Надо сделать чуть побелее.

Акриловая краска на него уже не ложится. Высыхает дырами (как на полиэтилене), а потом смывается губкой с мылом.




А еще можно так. Это после железной щетки. Углы обработаны фрезой. После первого слоя краски всё равно придется пройтись наждачкой, иначе само дерево как наждачка будет.

Android закончился.

$
0
0
Изучение программирования под Андройд закончилось, не успев начаться. У меня больше нет планшета. Был разбит трехлетним ребенком.



Купят на работе или сам куплю с зарплаты? Вряд ли. Новости от начальства такие. В этом месяце мы заработали 70 тыс. Бюджет будет распределен так: европатент, аренда офиса, аденда сервера. Зарплаты не будет, всем еще надо скинутся по 2 тыщи. (шутка юмора конечно)

Отличный повод завязать с программированием.

(И не надо думать, что я тут реву у монитора. И вызываю жалость. Наоборот. Ржачно же. Вся сложившаяся ситуация - абсурд. Наслаждайтесь со мной.)

Или купить недорогой б/у планшет тыщи за две. Такую сумму я могу потратить без проблем. Если мои программы на нем нормально будут работать (не тормозить), то везде будут нормально работать.

UPD: Бинго! Еще и экран ноутбука дитя поломала.

Доработки в трансляторе PDP11ASM

$
0
0
По просьбам трудящихся добавлена некоторая совместимость с транслятором MACRO11.

Добавлена примитивная арифметика. Только сложение и вычитание без скобок. Например текст 2+5-1 будет преобразован в число 6. Соответственно Label1 + 6 это адрес на 6 больше адреса метки Label1.

Добавлены числовые метки. Например "10:". Их область видимости ограничена символьными метками. И их можно использовать только с командами условного перехода: B? и SOB. Любое положительноечисло в аргументе этих команд интерпретируется как метка.

При таком подходе любимая PDP-шниками команда "SOB R1, .-2"не работает, так как 2 интерпретируется как метка. Но благодаря исключению с отрицательными числами можно написать "SOB R1, .+-2". Похоже на костыль, но я не знаю как сделать красивее.

Добавлены синонимы: RET = RTS PC, CALL = JSR PC, .BYTE = DB, .WORD = DW, .LINK = ORG. Вместо EQU можно писать =. Добавлена новая команда .ASCII/текст/. Хотя это можно было сделать командой db "текст". Новые команды: .BLKN N - вставить N байт 0, .BLKW N - вставить N слов 0, .END - ничего не делает.

Добавлена переменная . (точка), содержащая адрес текущей команды.

По умолчанию числа теперь 8-ричные. Что бы указать 10-чное число, необходимо в конец числа добавить точку. Например "16384.".

C помощью команды DECIMALNUMBERS можно включить по умолчанию десятичные числа. Восьмиричные числа тогда начитаются с нуля, например 017666. Или можно добавить постфикс 17555o. Обратно включить по умолчанию 8-ричные числа можно командой DECIMALNUMBERS OFF.

В одной строке может быть несколько команд. Перенос строки теперь не обязателен.

Добавлена команда MAKE_BINARY_FILE выгружающая дамп памяти. Первый аргумент - имя файла, второй - начальный адрес, третий - конечный адрес. Обязательный аргумент только первый.
Viewing all 319 articles
Browse latest View live