середу, 20 вересня 2023 р.

Про мобільну розробку в СРСР

Якось я знайшов у себе в сараї старі носії інформації з програмами для радянського мобільного девайсу. Пустивши скупу чоловічу сльозу за старими-добрими часами я вирішив розповісти читачам про мої перші кроки в галузі ІТ. 

ТТХ

Девайс, про який я писав – це програмований мікрокалькулятор (ПМК) Електроніка МК-61. Цей калькулятор використав зворотний польський запис (привіт, Forth!), тому майже всі, хто його вперше бачив, запитував: "А де тут знак равно". Також у калькулятора було 15 регістрів для зберігання даних та 105 байт оперативної пам'яті.
Тож у моєму дитинстві іграшки були навіть не кілобайтними.

Після вимкнення живлення оперативна пам'ять очищалося і при наступному включенні програму доводилося знову вводити. Пізніше з'явилася Електроніка МК-52, яка мала не тільки енергонезалежну пам'ять, а й можливість підключати блоки розширення пам'яті (БРП) з додатковими програмами.

ПМК Store/Play

У СРСР було випущено кілька десятків книг про ПМК та програми для них. Наприклад, першою моєю книжкою-підручником була Калькулятор – твой помощник и соперник в играх. Вона в мене з'явилася раніше, ніж сам калькулятор. Також випустили кілька БРП для МК-52.

Але, мабуть, найбільший внесок у популяризацію ПМК та програмування внесли ряд радянських журналів. Одним із перших став писати про ПМК журнал "Наука и жизнь". Також низка статей опублікувала журнал "Квант". За рідкісним винятком розглядалися переважно прикладні програми. Ігор було досить мало. Кардинально ситуація змінилася з появою у журналі "Техника молодежи" ("ТМ") рубрики "Клуб электронных игр". За роки існування рубрики в ній не тільки було опубліковано безліч найрізноманітніших ігрових програм, а й багато уваги приділяли недокументованим можливостям ПМК. Ще одним журналом, який приділяв увагу ігровим програмам, була українська "Піонерія".

У 1988 р. виник Клуб любителів ігрових програм (КЛІП) своєрідна соціальна мережа (а точніше BBS) з листування. Клуб об'єднав до 600 користувачів ПМК із усього СРСР. 

Класифікація ігор

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

Сімулятори

Існувала безліч різноманітних симуляторів. Як правило, процес гри виглядав наступним чином. Гравець вводив нові значення ряду параметрів (витрата палива, нова швидкість, кут нахилу, період часу, протягом якого ці параметри діяли) і запускав обчислення. Через якийсь час ПМК показував нове положення та параметри об'єкта, що симулюється (висота або пройдена відстань, нова швидкість і т.д.). Так як за часів СРСР дуже популярною була тема космосу, то існувала низка симуляторів космічних літальних симуляторів. У "ТМ" було надруковано фантастичну повість "Шлях до Землі", в якій герої на маленькому лунолеті здійснюють переліт з Місяця на Землю. Кожен розділ описував якийсь із етапів подорожі. Крім цього, глави також супроводжувалися однією або декількома програмами, за допомогою яких читачі могли переконатися, що все описане - істинна правда. Таким чином, автори ТМ створювали художній твір за програмами для комп'ютерів (або програми за книгою) задовго до того, як це стало мейнстримом.

Карта моїх польотів на околицях орбітальної станції "Юрій Гагарін":


(на жаль, до станції потрапив метеорит).

Стратегії

Першою економічною стратегією, в яку я грав був Веселий фермер симулятор колгоспу: треба було садити різноманітні агрокультури і збирати врожай. Після того, як у СРСР дозволили громадянам займатися індивідуальною трудовою діяльністю (тоді це так називалося), з'явився симулятор кооперативного кафе.

Також були воєнні стратегії. Наприклад, можна було повторити битву під Фермопілами.

Настільні

Очевидно, що навчити ПМК грати у шашки, а тим більше у шахи неможливо. Однак розіграти деякі ендшпілі цілком реально.
Фото шахівниці, розміченої для гри з ПМК:


Найцікавішою для мене грою була Вовк та вівці. Швидко з'ясувалося, що на звичайній шахівниці 8x8 грати не цікаво: чотири вівці завжди виграють, а три - програють. Тому було розроблено варіант гри на полі 9x9. І хоча реалізувати мінімаксний алгоритм не можна було, підсумкова програма вийшла досить сильною. Ця гра мене настільки вразила, що пізніше я зробив варіант для MS-DOS, а пізніше для Android.

Динамичні відеоігри

Дві особливості ПМК дозволяли реалізувати динамічні відеоігри. По-перше, під час обчислень на індикаторі відображалися якісь поточні значення. Таким чином, можна було демонструвати динамічну "картинку". По-друге, у перших моделях калькуляторів був кумедний апаратний баг. ПМК мали перемикач "Р-Г" для обчислень тригонометричних функцій у радіанах та градусах  відповідно. Незабаром з'ясувалося, що якщо не встановлювати перемикач у крайні положення, а зафіксувати по центру, він виконуватиме обчислення в градах (100 градів - це 90 градусів). Незабаром цей баг перетворили на фічу: у перемикача з'явився третій стан "ГРД". Якщо обчислити значення cos 100, можна визначити положення перемикача: для градусів отримаємо значення -0,17, тобто. негативне значення, для градів – природно, 0, для радіан 0,19 – позитивне число. Всі ігри даного жанру будувалися за одним принципом: ПМК якийсь час показував на екрані поточну ситуацію, даючи можливість гравцю прийняти рішення. Потім визначав положення перемикача "Р-ГРД-Г" та виконував обчислення. Збоку це виглядало досить кумедно: гравець вдивлявся в миготливий екран і судомно смикав перемикач.

Еггогологія

Як будь-який комп'ютер, що поважає себе, ПМК міг відображати шістнадцятковий числа. Але через обмеження індикатора вони виглядали трохи дивно. Наприклад, "A" позначалася як "-", "B" - "L". У разі помилок калькулятор виводив слово "Error", але виглядало воно як "ЕГГОГ", що й назвало процесу вивчення недокументованих можливостей ПМК. Виконуючи хитрі операції над дуже великими числами (які калькулятор теоретично не міг відображати) або звертаючись до великих адрес програмної пам'яті можна було отримувати різноманітні написи.

Наприклад, у грі "Лунолет-3" з повісті "Шлях до Землі" положення місяцеліта щодо Землі та Місяця відображалося таким чином:


"E" - Земля, "0" - Місяць, "-" - місяцеліт.

Калькулятори МК-61/52 підтримували операції булевої алгебри. Але їх зазвичай використовували лише для формування ряду повідомлень: "8CE" - гра закінчена, "6-L6EC" - людина програла:


Також було кілька ігор, які використовували ці операції кодування лабіринтів.


Сімулятори и емулятори ПМК

Існує кілька симуляторів ПМК, наприклад, "Калькулятори-3000". Існує також реальний емулятор emu145. Автор емулятора – Фелікс Лазарєв – навіть купував професійний мікроскоп для фотографування мікроконтролерів серії 145/745.

Мій шлях

У мене калькулятор МК-61 з'явився у 1989р. Вийшло так, що про існування КЛІПу я не знав. Основну масу програм черпав з "ТМ" - або переписував у бібліотеці (ксероксів тоді ще не було), або брав у товаришів (зазвичай, потім вже назад не віддавав). У нас були журнали "Наука та життя" за кілька років. Але в ньому друкувалися переважно прикладні програми, що мене мало цікавило. Однак більше, ніж грати мені подобалося писати програми. Я до речі ніколи не розумів принад типу Dendy - адже їх не можна було програмувати в домашніх умовах. Першою моєю іграшкою був космічний симулятор, написаний під впливом "Лунолетів". Це було у 6 класі, на уроках фізики ми до цього часу вивчили лише рівномірний прямолінійний рух. Тому грати у нього було не дуже цікаво. На програмування я витратив більше часу, ніж на саму гру. Потім була ще низка програм. Найбільш серйозною моєю програмою була реалізація калаха (манкали). Незважаючи на обмежені ресурси ПМК, він вигравав у мене досить часто. Я навіть не знаю, коли більше радів: коли вигравав сам або коли програвав своїй програмі. Нещодавно я зробив версію манкали для Android з кількома варіантами ігор. Тепер можна просто грати, а не страждати. А оскількі я робив її вже на Flutter, то можна спробувати навіть просто в web lite-версію.

Декілька фото згаданих раніше носіїв інформації:




Спробувати

Звичайно, справжній задрот чоловік із задоволенням витратить півгодини на вбивання коду програми для того, щоб потім п'ять хвилин пограти. Для тих, що слабкий духом, я приготував спеціальну версію емулятора з підтримкою експорту/імпорту програм (я розмістив це емулятор від свого імені з дозволу Станіслава). Спочатку я просто хотів додати мождивість імпорту та експорту, але потім додав ряд корисних функцій. Наприклад, емулятор має вбудовану інструкцію (це відсканована офіціальна інструкція) та опис недокументованих можливостей:

також можна створювати інструкції до програм у вигляді html-файлів, які емулятор буде показувати і більше не буде потреби записувати програми в зошити, як я робив колись:


Також додав можливість відображення на індікаторі вмісту двох регістрив: не лише X, а й Y. Це корисно для програм, які виводять при останові в регистр X основну інформація, а в Y - допоміжну. Так роблять, зокрема програми-місяцельоти:


Також я підготував кілька програм для цього емулятора. Достатньо скопіювати *pmk та * html файли на смартфон та імпортувати його в емулятор.

 Приємного занурення в історію!








четвер, 21 липня 2022 р.

Манкала-ігри. Калах

 Як і обицяв, продовжу розповідати про мої ігри сімейства манкала.

Перша гра, яку я реалізував - це калах. Цей вариант придумав в середині XX сторіччя американець Вільям Чемпіон і назвав "калах", натякаючи, що гра походить з пустелі Калахарі. Можливо, завдяки своєму походженю, цей варіант ианкали є найбільш відомим у Західному світі. Фактично, калах є більш простим варіантом гри чонгкак (колись я зроблю і цю гру).

Правила гри доволі прості:

  1. На дошці для калах з кожного боку є 6 невеликих лунок, які називаються будиночками; і велика лунка, яка називається кінцевою зоною або коморою, або манкалою, на кожному кінці. Мета гри - захопити більше зерен насіння (камінців), ніж у опонента.
  2. На початку гри чотири (п’ять або шість) зерен насіння розміщуються в кожній лункці. Кожен гравець керує шістьма лунками та їх насінням на стороні гравця на дошці. Рахунок гравця — це кількість зерен насіння в його коморі.
  3. Гравці по черзі сіють своє насіння. У свій хід гравець видаляє всі зерна насіння з однієї з підконтрольних йому лунок. Рухаючись проти годинникової стрілки, гравець по черзі скидає по одному зернятку в кожну лунку, включаючи власну комору гравця, але не його суперника.
  4. Якщо останнє посіяне зернятко потрапляє в комору гравця, він отримує додатковий хід. Кількість ходів, які гравець може зробити у свою чергу, не обмежена.
  5. Якщо останнє посіяне зернятко потрапляє в порожню лунку, що належить гравцеві, а в протилежній лунці є насіння, і останнє, і протилежні зерна захоплюються і поміщаються в комору гравця.
  6. Коли один із гравців більше не має насіння в жодній зі своїх лунок, гра закінчується. Інший гравець переміщує все насіння, що залишилося, до своєї комори, і виграє той, у кого найбільше насіння.

Вперше  я дізнався про цю гру з додатка до журнал "Юный техник".

Картинка з журнала ЮТ

Дошку я зробив з пенопласту, а в якості кацінців використовував шарики з підшипника, що мені приніс батько.  
Згодом я намагався запрограмувати цю гру на калькуляторі МК-61. 


Лістинг першої версії мобільного калаха

Хоча в моєму розпоряджені було лише 105 кроків для программи, інколи вона в мене навіть вигравала.

Нещодавно я зробив нову версію, вже для Android (оскільки сумніваюсь, що у багато кого досі є МК-61): https://play.google.com/store/apps/details?id=org.xbasoft.mancala

Грати можна як проти бота (з трьома рівнями складності), так і против людини, як локально, так і онлайн.

Удачі!


понеділок, 18 липня 2022 р.

Манкала - найдавніша жива настільна гра

 За свою історію людство вигадало багато настільних ігор. Найбільш відомі у Західному світі - шашки та шахи. У Східному - го та рендзю (а ще нарди). Якщо ж замислитись, а яка з ігор є найдавнішою, то можна згадати, наприклад, гру міста Ур, або давноєгипетські "Пси та шакали".  Але справа в тому, що ми не знаємо правил цих ігор. Так, вони були реконструйовані, але ми не можемо напевно стверджувати,  що ці нові правила співпадають з оригінальними.

Однак, вже кілька тисячоліть існує гра, яка не тільки вельми популярна й в наш час, але й для якої час від часу вигадують нові варианти. Ця гра - манкала. Точніше, це сімейство ігор зі схожими правилами, які розповсюджені в основному в Африці та Південно-Східний Азії. Деякі з них, як казахський тогыз кумалак (або киргизський тогуз коргоол - ці країни досі сперечаються, кому має належити ця гра) включені навіть у список нематеріальної спадщини ЮНЕСКО (як і наш борщ).

Основна ідея ігор манкала полянаяє в наступному. У кожного гравця на полі є ряд ямок або лунок. Можуть бути також специальні лунки - комори. На початку гри в лунки кладуть певну кількість камінців, або зерняток. Дошки для гри можуть робитися з дерева і прикрашатися різбленням (як дошки для нард). А які-небудь пастухи можуть просто викопати ямки в землі і грати козячими какашками. Таким чином, манакала - це не тількі найдавніша настільна гра, а й найдавніша напідложна гра. 

Початкова позиція гри.


Дошка для гри в вари (oware).


Одна з найдавніших досок для так званної трирядної манкали - з трьома рядками лунок. А є ще й чотирирядні. (всі фото взяти з wikipedia) 

У свій хід гравець бере всі камінці (а може й не камінці)  з будь-якої своєї лунки і родить так званий посів - послідовно (але не тому, що янукович) розкладає камінці у інші лунки.  Наприкінці хода іноді може бути виконаний захват, коли гравець переміщує частину
своїх камінців и камінців суперника у свою комору. Мета гра - зібрати у своїй коморі більше камінців (зерняток), ніж суперник. Таким чином, якщо шахи, або го моделюють війну, то калах - процес землеробства. В деяких іграх навіть є так зване правило "голоду".

Існує достатньо багато реалізацій манкал для смартфонів та комп'ютерів. Зі свого боку, я досить давно вже хотів зробити  свій вариант. Оскільки всі існуючи мають свої недоліки. Наприклад, більшість з мобільних версій працюють в ландшафтній орієнтації, а мені більш подобається портретна. Під час гри важливо знати кількість камінців у лунках не лише перед своїм ходом (що більшість програм показує), але й після. А я доволі лінивий і хотів би, щоб смартфон сам за мене все обчіслював. До того ж, варіанті манкал існує кілька десятків, є навіть манкали-пасьянси, А існуючі програми реалізують лише 2-3 найпоширенеших. Тому я вирішив зробити свою версію мобільної манкали. Точніше, першу версію мобільної манкали я зробив ще десь у 1991 або 1992 р. Настав час зробити новий реліз. Прості правила доволі легко запрограмувати. Для штучного інтелекту реалізація мінімаксного алгоритму буде досить простою. Для оцінки позиції можна буде використовувати кількість камінців в коморах (коли я робив п'ятипольне коно найскладнішою задачею було придумати самє функцію оцінки позиції).     

Також я напишу кілька статей про кожний реалізований варіант гри.

Наразі я релізував один з вариантив гри - калах. Розповім про нього завтра чи після завтра. Поки що можна подивитись маленьке відео:


Або встановити на Android щоб пограти: https://play.google.com/store/apps/details?id=org.xbasoft.mancala (правила додаються).

Або пограти з браузера: https://xvadim.github.io/xbasoft/mancala_ua.html 

пʼятницю, 6 травня 2022 р.

Автоматизація оновлення версії flutter-додатків

При розробці я змінюю версію додатка окремим коммітом в репозиторій. Для цього потрібно натиснути багато разів клавіши щоб:

1. змінити номер версії у файлі (build.gradle, *.xcodeproj, pubspec.yaml

2. сформувати комміт з відповідним коментарем.

Але хороший програміст - це лінивий програміст, і якщо якусь дію треба виконувати більше двох раз, треба її автоматизувати. Для нативної розробки можна використовувати fastlane, а ось для Flutter я зробив свій скрипт.

По-перше, необхідно встаноити пакет cider, він дозволяє, окрім іншого маніпулювати версією в файлі pubspec.yaml. Наприклад, команда:

cider bump patch --bump-build

змінює patch-частину версії.

По-друге, я зробив такий скрипт:

#!/bin/sh

ver=`cider bump $1 --bump-build`

git commit -a -m "Bump version to $ver"

він викликає cider для звіни версії, а потім робить комміт.

Теперь достатньо виконати:

 ~/bin/fbv patch

для створення комміту з новою версією. Причому наступного разу цю команду можн буде просто підняти з історії команд.

неділю, 22 серпня 2021 р.

Кросплатформена розробка на Flutter. Частина II

 Основи Flutter

В першій частині я розповів постановку задачі. Тепер переходжу до опису процессу розробки.

Dart

Ядро Flutter написано на C++. А ось розробка виконується на мові програмування Dart. Вона розроблялась Google як більш сучасна альтернатива JavaScript. Використання не дуже поширенної мови замість, наприклад, Python або навіть JavaScript, розробники Flutter аргументують в тому числі і можливістю швидко вносити в мову необхідні нові можливості. Dart дуже схожа на більшість сучасних мов. Однак, не така солоденька, як Swift.

Flutter - все є віджет

Заголовок підрозділу - це основна концепція Flutter. Наприклад, є віджет для відображення тексту:

Text('Copyright(c) 2021 Vadym A. Khokhlov')

Якщо необхідно додати навколо тексту відступи, ми вставляємо його у віджет Padding:

Padding(
   padding: EdgeInsets.symmetric(vertical: 8.0),
   child: Text('Copyright(c) 2021 Vadym A. Khokhlov'),
),

Программа - це теж віджет. Ось, наприклад, як зазвичай виглядає початок:

void main() {
  runApp(NumberFactsApp());
}
class NumberFactsApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Facts about numbers',
      home: const NumberFactsScreen(),
    );
  }
}

Функція main запускає віджет NumberFactsApp як головний віджет програми. Він має обов'язково реалізувати метод build для своєї побудови. Цей метод повертає інший віджет - MaterialApp, якому в якості аргументу home треба вказати ще один віджет - в данному випадку NumberFactsScreen. Таким чином програма представляє собою дерево віджетів. Насправді дерев три:  Widgets, Elements, RenderObjects. Але програмісти в основному працюють саме з першим.

Стан віджета

Flutter надає крила два основних класа віджетів: stateless та statefull. 

Якщо вигляд віджету не від чого не залежить, то він утворюється як підклас StatelessWidget. Приклад - наведений вище NumberFactsApp.

Якщо ж віджет має змінювати вигляд у відповідь на дії користувача або залежить ще від якіхось факторів, то він утворюється як підкласс StatefulWidget. Такі віджети зберігають свій стан в об'єкті окремого класу, підкласу State. Ось приклад віджету, що дозволяє користувачеві вибирати мову, на якій будуть відображатись факти:

class _LangSelector extends StatefulWidget {
  ...
  @override
  __LangSelectorState createState() => __LangSelectorState();
}

class __LangSelectorState extends State<_LangSelector> {
  final LangsService langsService = serviceLocator<LangsService>();

  @override
  Widget build(BuildContext context) {
    return TextButton(
        onPressed: () {
          setState(() {
            _curLangIndex = 1 - _curLangIndex;
            ...
          });
        },
        child: Text(langsService.flag(_curLangIndex)));
  }

  int _curLangIndex = 0;
}

Для того, щоб повідомити Flutter, що стан віджету змінився і його необхідно перебудувати використвується метод setState. Одна з особливостей Dart полягає в тому, що в ній немає якогось слова для позначення  приватних методів або змінних. Замість цього достатньо ім'я розпочати з _. (Про langsService я розповім пізніше).

Звісно, що змішувати в одному класі і логіку роботи віджета, і опис його вигляду - погана ідея. Тому у Flutter використовуються механізми керування станом (state management), що дозволяют відокремити логіку від інтерфейсу. У наступних статтях я розповім про один з них. Хоча свою першу гру я написав без використання таких механізмів. Але я стидаюсь показати її код :)

Документація по widget'ам Flutter тут.

Зміст

2. Кросплатформена розробка на Flutter. Частина II

середу, 18 серпня 2021 р.

Кросплатформена розробка на Flutter. Частина I

 Коротко про Flutter

В компанії Postindustria я працюю iOS-розробником, а у вільний час в якості хобі займаюсь розробкой мобільних додатків для Android. Останні десь два роки я цікавлюсь Flutter - це фреймворк від Google для розробки додатків. Наразі це єдиний фреймворк (як запевняє Google), що дозволяє з одного коду отримувати додатки для шости платформ:
  • iOS
  • Android
  • web
  • Linux
  • macOs
  • Windows
Крім підтримки майже всіх популярних платформ він має наступні переваги:
  • на iOS та Android програма компілюється в нативний код, тобто немає ніяких js-bridges, як, наприклад, для React Native;
  • підтримує just-in-time та ahead-of-time режими компіляції. Перший дозволяє бистро компілювати код при розробці, а другий - отримувати оптимальну швидкодію для release-варіантів.
  • як на мене, підхід до побудови інтерфейсів на Flutter більш приємний і зручніший, ніж нативні варіанти для мобільних платформ; 
  • режим hot reload дозволяє тестувати зміни інтерфейсу без перекомпіляції коду;
  • версії додатка для різних платформ можуть мати однаковий вигляд оскільки всі віджети Flutter малює сам, а не делегує це базовій платформі
До недоліків можно віднести:
  • це продовження останньої переваги. Flutter має багатий набір віджетів, що імітують виджети iOS або Android. Але коли на якійсь платформі з'являється новий, доводиться чекати, коли буде реалізований аналог на Flutter;
  • дуже слабка підтримка SEO для web.
Таким чином, Flutter дуже підходить для розробки додактів, що мають виконуватись більш, ніж на одній платформі. При чому процес проходить дуже швидко и часто навіть приємніше ніж із застосуванням нативних засобів платформи.

 Мета

За останній час я встиг розробити на Flutter кілька простих ігор. В деякі можна грати навіть з іншими гравцями по Internet. Однак, переважна більшість додатків відрізняється від ігор. Як правило, вони звертаються до якогось серверу, отримують данні, показують їх користувачеві, дозволяють їх редагувати. Я вирішив написати один такий невеличкий додаток і описати процесс в кількох статтях. Це не буде детальний опис програмування на Flutter. Я планую показати основні можливості. Також я хочу трохи самому розібратися с Clean Architecture від дядечка Боба і з тестуванням Flutter-додатків.

Додаток

Я розробив невеличкий додаток, що використовує сервис NUMBERSAPI в якості серверної частини. Цей сервіс має невеличкий API для отримання цікавих фактів про числа та дати.
Моя програма буде показувати факти, а також мати можливість перекладати факти на декілька мов.
Декілька скриншотів.
Android:

iOS:

web:


Тут можна побачити, як працює web-версія на сторінці в iframe.
Є невеличка проблема в тому, що на Github використовується https, а на сайте Numbersapi - http. З цієї причини виникає помилка mixed-content при виконанні запитів на Numbersapi. Але загальне уявлення про flutter-додатки в web отримати можна: кнопки і переклад працюють.

На Android встановити додаток можна з Google Play.

Вихідні тексти додатка можна отримати тут.
Для самостійної зборки треба встановити Flutter, як описано тут a також засоби розробки для Android або iOS з емудяторами. Після цього можна запускати:

     flutter run -d Android

  flutter run -d iPhone

  flutter run -d chrome

Для Andoid/iOS після -d треба вказати справжнє ім'я емулятора.

В наступних статтях я буду пояснювати як саме розроблявся цей додаток.

Зміст

1. Кросплатформена розробка на Flutter. Частина I

середу, 15 червня 2016 р.

О мобильных приложениях в Советском Союзе

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

ТТХ

Девайс, о котором я писал - это программируемый микрокалькулятор (ПМК)   Электроника МК-61. Этот калькулятор использовал обратную польскую запись (привет, Forth!), поэтому почти все, кто его первый раз видел, спрашивал: "А где здесь равно". Также у калькулятора было 15 регистров для хранения данных и 105 байт оперативной памяти.
Так что в моем детстве игрушки были даже не килобайтными.

После выключения питания ОЗУ очищалось и при следующем включении программу приходилось вводить заново. Позже появилась Электроника МК-52, у которой была не только энергонезависимая память, но и возможность подключать блоки расширения памяти (БРП) с дополнительными программами.

ПМК Store/Play

В СССР было выпущено несколько десятков книг о ПМК и программах для них. Например, первой моей книжкой-учебником была Калькулятор - твой помощник и соперник в играх. Она у меня появилась даже раньше, чем сам калькулятор. Также было выпущено несколько БРП для МК-52.

Но, пожалуй, наибольший вклад в популяризацию ПМК и программирования внесли ряд советских журналов.Одним из первых стал писать о ПМК журнал "Наука и жизнь". Также ряд статей опубликовал журнал "Квант". За редким исключением рассматривались в основном прикладные программы. Игр было довольно мало. Кардинально ситуация изменилась с появлением в журнале "Техника молодежи" ("ТМ") рубрики "Клуб электронных игр". За годы существования рубрики в ней не только было опубликовано множество разнообразнейших игровых программ, но и много внимания уделялось недокументированным возможностям ПМК. Еще одним журналом, уделявшим внимание игровым программам была украинская "Пионерия".

В 1988 г. возник Клуб любителей игровых программ (КЛИП) своеобразная социальная сеть (а точнее BBS) по переписке. Клуб объединил до 600 пользователей ПМК со всего СССР. С историей КЛИПа можно ознакомиться здесь и здесь.

Классификация игр

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

Симуляторы

Существовало множество разнообразных симуляторов. Как правило процесс игры выглядел следующим образом. Игрок вводил новые значения ряда параметров (расход топлива, новая скорость, угол наклона, период времени, в течение которого данные параметры действовали) и запускал вычисления. Через какое-то время ПМК показывал новое положение и параметры  симулируемого объекта (высота или пройденное расстояние, новая скорость и т.д.). Так как во времена СССР очень популярной была тема космоса, то существовал ряд симуляторов космических летательных симуляторов. В "ТМ" была напечатан фантастическая повесть "Путь к Земле", в которой герои на маленьком лунолете совершают  перелет с Луны на Землю. Каждая глава описывала какой-то один из этапов путешествия. Помимо этого главы также сопровождались одной или несколькими программами, с помощью которых читатели могли удостовериться, что все описанное - истинная правда. Таким образом, авторы "ТМ" создавали художественное произведение по программам для компьютеров (или программы по книге) задолго до того, как это стало мейнстримом.
Карта моих полетов в окрестностях орбитальной станции "Юрий Гагарин"
(к сожалению, в станцию попал метеорит)

Стратегии

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

Также были военные стратегии. Например, можно было повторить битву под Фермопилами или Невскую битву.

Настольные

Очевидно, что научить ПМК играть в шашки, а тем более в шахматы невозможно. Однако разыграть некоторые эндшпили вполне реально.
Фото шахматной доски, размеченной для игры с ПМК:


Самой интересной для меня игрой была Волк и овцы. Быстро выяснилось, что на обычной шахматной доске 8x8 играть не интересно: четыре овцы всегда выигрывают, а три - проигрывают. Поэтому был разработан вариант игры на поле 9x9. И хотя реализовать минимаксный алгоритм было нельзя, итоговая программа получилась довольно сильной. Эта игра меня на столько впечатлила, что позже я сделал вариант для MS-DOS, а пару лет назад и для Android.

Динамические видеоигры

Две особенности ПМК позволяли реализовать даже динамические видеоигры. Во-первых, во время вычислений на индикаторе отображались какие-то текущие значения. Таким образом можно было демонстрировать динамическую "картинку". Во-вторых, в первых моделях калькуляторов был забавный аппаратный баг. ПМК имели переключатель "Р-Г" для вычислений тригонометрических функций в градусах и радианах соответственно. Вскоре выяснилось, что если не устанавливать переключатель в крайние положения, а зафиксировать по центру, то он будет выполнять вычисления в градах (100 градов - это 90 градусов). Вскоре этот баг превратили в фичу: у переключателя появилось третье состояние "ГРД". Если вычислить значение cos100, то можно определить положение переключателя: для градусов получим значение -0,17, т.е. отрицательное значение, для градов - естественно, 0, для радиан  0,19 - положительное число. Все игры данного жанра строились по одному принципу: ПМК какое-то время показывал на экране текущую ситуацию, давая игроку возможность принять решение. Затем определял положение переключателя "Р-ГРД-Г" и выполнял вычисления. Со стороны это выглядело довольно забавно: игрок всматривался в мигающий экран и судорожно теребил переключатель.

Еггогология

Как всякий уважающий себя компьютер, ПМК мог отображать шестнадцатеричный числа. Но из-за ограничений индикатора выглядели они немного странно. Например, "A" обозначалась как "-", "B" - "L". При возникновении ошибок калькулятор выводил слово "Error", но выглядело оно как "ЕГГОГ", что и дало название процессу изучения недокументированных возможностей ПМК. Выполняя хитрые операции над очень большими числами (которые калькулятор теоретически не мог отображать) или обращаясь к большим адресам программной памяти можно было получать разнообразные надписи.

Например, в игре "Лунолет-3" из повести "Путь к Земле" положение лунолета относительно Земли и Луны отображалось следующим образом:

"E" - Земля, "0" - Луна, "-" - лунолет.

Калькуляторы МК-61/52 поддерживали операции булевой алгебры. Но их обычно использовали лишь для формирования ряда сообщений: "8CE" - игра окончена, "6-L6EC" - человек проиграл:
Также было несколько игр, использовавших эти операции для кодирования лабиринтов.

Более подробно история ПМК изложена здесь, а здесь большой набор игр.

Симуляторы и эмуляторы ПМК


Существует несколько симуляторов ПМК, например "Калькуляторы-3000". Существует также реальный эмулятор emu145. Автор эмулятора - Феликс Лазарев - даже покупал профессиональный микроскоп для фотографирования микроконтроллеров серии 145/745. На этом форуме можно проследить историю разработки.

На основе emu145 Станислав Боруцкий создал эмулятор для Android.

Мой путь


У меня калькулятор МК-61 появился в 1989г. Получилось так, что о существовании КЛИПа я не знал. Основную массу программ черпал из "ТМ" - либо переписывал в библиотеке (ксероксов тогда еще не было), либо брал у товарищей (как правило, потом уже обратно не отдавал). У нас были журналы "Наука и жизнь" за несколько лет. Но в нем печатались в основном прикладные программы, что меня мало интересовало. Однако больше чем играть мне нравилось писать программы. Я кстати никогда не понимал прелестей приставок типа Dendy - ведь их нельзя было программировать в домашних условиях. Первой моей игрушкой был космический симулятор, написанный под влиянием "Лунолетов". Это было в 6 классе, на уроках физики мы к этому времени изучили только равномерное прямолинейное движение. Поэтому играть в него было не очень интересно. На программирование я потратил времени больше, чем на саму игру. Потом был еще ряд программ. Наиболее серьезной моей программой была реализация калаха (манкалы). Не смотря на ограниченные ресурсы ПМК, он выигрывал у меня довольно часто. Я даже не знаю, когда я больше радовался: когда выигрывал сам или когда проигрывал своей программе. Не так давно я сделал версию манкалы для Android с несколькими вариантами игр. Теперь можно просто играть, а не страдать.

Несколько фото упомянутых ранее носителей информации:




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

Попробовать


Конечно, настоящий задрот мужчина с удовольствием потратит полчаса на вбивание кода программы с тем, чтобы потом пять минут поиграть. Для тех же, что слаб духом, я приготовил специальную версию эмулятора с поддержкой экспорта/импорта программ (я разместил это эмулятор от своего имени с разрешения Станислава). Также я подготовил несколько программ для этого эмулятора. Достаточно скопировать *pmk-файл на смартфон и импортировать его в эмулятор.

Приятного изучения!

P.S. у сарая, в котором я нашел свои тетради была металлическая дверь с надписью "ЕС-1050".