Комментарии 20
Очень круто! Даже захотел попробовать достать МК-61 и запустить. У меня есть такой аппарат, я запускал на нём разные программы, но сопоставимого по уровню написать особо не довелось.
Другой задачей, которую я хотел решить — это разобраться, каким образом изобретались подобные программы для микрокалькуляторов.
Тоже было интересно. Азы программирования под этот аппарат есть в инструкции, но в наши времена реально впечатляет, как в 105 шагов смогли упихать не просто расчётные программы, а даже целые игры с сюжетом. Оптимизация тут очень на уровне.
Круто! Все мое детство прошло за написанием програм для МК-52 пока не собрал Специалиста))
А "посадка на Луну" кстати была в 2х вариантах: в упрощенном чисто вертикальном режиме, и в режиме с заданным местом посадки! Но как по мне интереснее было авторалли и морской бой, хотя он был и не очень
Как я понял, функция cos в программе используется в качестве нахождения остатка от деления по модулю 2 (сишное выражение %). То есть cos(1*pi), cos(3*pi), cos(5*pi) == -1,
а cos(2*pi), cos(4*pi), cos(6*pi) == +1.
Из-за того, что у калькулятора ограничена память программ, производилась какая-то дичайшая оптимизация, поэтому она выглядит так запутанно. Но, к моему сожалению, ни толковой литературы, ни описания, как это делалось, мне не удалось найти.
Ребятишки узнали про аппаратные ограничения и возможности/способы эти ограничения обойти.
Та самая ЕГГОГология?
Что-то не встречал молодежи, которые занимаются калькуляторами. Моим детям эта древность уж точно не интересна. Хотя тоже программисты.
Или вы кого-то другого имели в виду?
Уверен, речь про молодёжь вашего времени. Когда эти калькуляторы были актуальны.
Ну даже в те годы у меня не было такого калькулятора и тогда я не занимался средствами оптимизации кода на калькуляторах.
Так что я не понимаю этот неконструктивный высокомерный выпад.
в те годы у меня не было такого калькулятора
И... что? Кого это останавливало (ну, кроме самых снежинок, хотя это слово изобретут лет на 40 позже)? У меня в те годы тоже не было такого калькулятора. Программы записывались в тетрадочку; программы, которые писал сам, отлаживались "в уме". До сих пор помню, как долго бился над программой, которая всё время получалась в 107 шагов, а памяти в МК-61 — 105. Однако после месяца измывательств таки утоптал.
Лёгкая зависть.
А что за программа была, интересно?
Не могу вспомнить, что за программа была, но припомнил некоторые детали. Программа была из журнала, написана для МК-61 и имела 100 шагов (на Б3-34 объём памяти — 98 шагов), а у нас в кружке были только они. Очень хотелось запустить её в кружке, но из-за этого не получалось, поэтому месяц сидел и крутил так и сяк, пытаясь "умять" те самые два лишних шага. В конце концов получилось, соптимизировал. Более подробно теперь не вспомню — всё-таки 30 лет прошло.
Возможно, понять как это работает поможет программа из вот этой книги.
Она для всеми любимого К580ВМ80А (ну и для Z80 должна подойти). Если её дизассемблировать (я бы просто в эмулятор спектрума загрузил бы Mons-4 и прошёлся бы по этой программе), то можно понять логику. Тригонометрии в ней вроде как не должно быть. Я, правда, эту программу не запускал никогда, так что не знаю, есть в ней ошибки или нет.
Спасибо, это очень годно. Со Спектрум так просто не выйдет, надо смотреть реализацию ввода-вывода. Но логика интересна, да.
Полагаю, ввод-вывод там простейший и виден будет сразу.
Вот набранная программа:
c000: 3e 09 32 00 90 d7 cd 1a c0 c3 47 c0 00 00 00 00
c010: 7a cd 1a c0 7a cd 1a c0 c7 00 06 01 90 c2 22 c0
c020: 3e 08 4f 32 00 90 d7 57 1e 04 d9 93 ca 32 c0 f2
c030: 35 c0 2e 08 65 6f 7a 95 ca 45 c0 00 00 26 73 7c
c040: 32 00 90 ef 76 79 c9 fe 01 ca 5e c0 fe 03 ca 5e
c050: c0 fe 05 ca 5e c0 fe 07 ca 5e c0 c3 10 c0 79 cd
c060: 1a c0 90 c3 3d c0 00 00 00 00 00 00 00 00 00 00
Вот только online-дизассемблер Z80 нифига не хочет это загружать. А помещать это внутрь эмулятора спектрума и вспоминать команды Mons-4 так лень... Может, потом гляну.
Идея алгоритма более-менее понятна, попытаюсь объяснить )
Программа начинает с хода на позицию 9, после чего ожидает вашего хода. Следующий ход программы будет ваш ход минус 1 (команды 24-25), при необходимости делая переход через начало. Например, если вы походите в позицию 1, программа ответит ходом на 8, т.е. переместится в соседнюю клетку против часовой стрелки. Затем приходит ваш черед ходить, и программа рассчитывает, что потенциально выигрышный ход для неё – это её предыдущий ход минус 4. В результате происходит сравнение вашего следующего хода с этим выигрышным ходом (шаги 42-44). Если ваш ход не совпадает с выигрышным, программа переходит к шагу 48 и завершает работу, заявляя о своей победе. Однако, если вы займете рассчитанную выигрышную позицию, то программа возвращается к команде 4, где происходит проверка четности последнего хода программы. Если этот ход нечетный, то по командам 9 и последующим переходом на 24 программа делает ход на одну позицию назад от своего последнего хода, создавая таким образом "вилку" (затем пользователь должен ходить на +4, и программа выигрывает, поставив свой крестик на позицию минус 1 от своего последнего хода). Если же последний ход программы был четным, то по команде 16 и последующему переходу на 24 программа ходит на одну позицию назад от последнего хода пользователя. Та же подпрограмма (команда 24) проверяет, закрыл ли пользователь клетку "программа + 4". Если после двух таких итераций пользователь закрывает эту клетку, программа завершает игру ничьей.
Великолепно, спасибо большое! Очень интересно.
Тут хоть какая-то логика есть.
Помню программу Магараджа для МК-52, типа упрощенных шахмат, где человек играет спецфигурой "магараджа", которая может как ферзь и конь ходить, а калькулятор "играет" обычным набором. Так там вообще было тупое проигрывание предопределенных ходов, а анализировались то ли два последних, то ли вообще только один последний ход человека. И в зависимости от этого определялся выигрыш или проигрыш. :) Короче, жульничество...
А, вот описание и код http://www.mk.semico.ru/brp4/brp4_31.htm
Одним словом, в значительном количестве тогдашних "игр" особо гениальных идей и алгоритмов не было, был чисто "вау-фактор": "надо же, эта хреновина ещё и в {крестики-нолики|калах|шахматы|...} играть умеет! И даже выигрывает!" — впрочем, с тогдашними вычислительными возможностями и объёмами памяти (105 шагов программы, 5 чисел на стеке и 15 в регистрах) на особо многое рассчитывать было бессмысленно...
Играем в крестики-нолики c RPN калькулятором