Это копия, сохраненная 15 июня 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Первая задача - найти программу, образующую легендарное "ЕГГОГ". В общем, удалось обнаружить, что производят сие слово команды под номерами D2 и
30 (причём D2, видимо, отвечает только за первый символ).
Немного поебавшись с кодом, получил такое описание команды №30:
Σ = R[0]; R[0] = R[3]; S = Σ
R[3] = R[6]
R[6] = R[9]
R[9] = R[12]
R[12] = R[15]
R[15] = R[18]
R[18] = R[21]
R[21] = R[24]
R[24] = R[27]
R[27] = R[30]
R[30] = R[33]
Σ = R[33]; R[33] = S; S = Σ
Σ = S1 + 1; П = (Σ > 0xF); L = П; S1 = Σ
Σ = R[36] + L; S = Σ
Σ = S; R[36] = Σ
Σ = 1 + 1; S = Σ
Σ = S + 1; S = Σ
Σ = ~S; S = Σ
Σ = R[41] + S; П = (Σ > 0xF); L = П; S = Σ
(разбиение по синхропрограммам).
В читаемом виде это выглядит примерно так:
\tS := R[0];
\tОТ сч := 0 ДО 30 ПО 3 ВЫП
\t\tR[сч] := R[сч+3]
\tКОН;
\tпам := R[33]; R[33] := S; S := пам;
\tЕСЛИ S1 = 0xf ТО
\t\tL := 1; S1 := 0
\tИНАЧЕ
\t\tL := 0; S1 := S1 + 1
\tКОН;
\tR[36] := R[36] + L;
\tL := 0;
\tS := R[41];
Само сообщение содержится в регистре R (42-х разрядный массив 4-битовых элементов) в элементах 24, 21, 18, ..., 0, последние три - в 33, 30 и 27.
Предлагаю всем уважающим себя программистам, не желающим шкварить себя стоянием в одном ряду с быдлокодерами, студентами и прочей премерзкой блядвой, присоединиться к историческому проекту обретения понимания работы внутренностей МК-61 - знания, о котором так мечтали ещё 20 - 25 лет назад многие тысячи русских людей!
` Высеры эти
` Читать
` отвратительно!
`
` Так получи же
` Ответ
` Решительный!
`
` Если зеленый
` Говна
` Наплодил,
`
` Выход единственный:
` Сажа!
` Скрыл!
Может это он и есть. Перебросили с хохлофронта обратно к нам. Там вроде чуть тише стает, личный состав можно на другие проэкты бросать.
Собственно, по этим фотографиям код и восстановили. Сделали эмулятор. А вот разобраться в содержании кода никто пока не смог.
три массива из 42-х 4-битовых слов M, R и ST;
регистры S и S1 размером 1 слово;
биты L, T и П.
А также:
1-словные переменные "вход" и "выход" для соединения с другими процессорами (всего их три, вместе с двумя регистрами памяти (по 252 слова) соединены в кольцо, по которому гоняются данные);
координаты нажатой кнопки x и y;
состояние переключателя меры угла;
переменные, указывающие на место запятой, необходимость его обновления, счётчик тактов, указатели на элементы программы.
Ну и нах J когда на божественном так же коротко, но ещё и читаемо?
fib = 0 : 1 : zipWith (+) fib (tail fib)
Как фибонач он, конечно, лучше, но рекурсивное определение легко обобщить на что угодно (простые числа, треугольные, что угодно).
отмечу в ретроспективе
А-тя-тя!
moar!
Fibonacci[100000]
1. Вот эти вот фоточки >>417116 >>416753 - это что такое? Неужели это прямо в открытом виде? Прямо на текстолите? Или фоточки сделаны под микроскопом? Какое увеличение? Что это?
2. Есть ли у нас эмулятор процессора + ром? Если есть, то мы же можем сделать поддержку GDB и прихуярить пошаговое выполнение, например, работу с памятью и вообще что угодно.
3. Как насчет сайд-эффектов? Где-то видел хуйню, которая подсовывала процессору все возможные варианты опкодов (и в регистры тоже) и вела километровые логи что и как оно отработало, таким макаром тестировали совместимость реального процессора и эмуля, искали недокументированные возможности и всю хуйню вроде сайд-эффектов.
4. Есть ли какая-то нормальная инфа по процессору/его регистрам, опкодам и прочему? Например, мне нихуя не понятно что такое "слово" - это 2 байта (word на языке спермоблядей)? А не много? Или что-то своё? Что за биты, где лежат? В каком-то Z-регистре кучкой? Кнопки чем обрабатываются, как прерывания сделаны и сделаны ли вообще?
5. А что хотим получить в итоге? Исходники прошивки на сишечке? Фреймверк для написания заставок на калькуляторе? Заменить ЕГГОГ на ГОГГЕ? Порт калькулятора на MTK и массовую продажу?
> Вот эти вот фоточки
Это фото вскрытой микросхемы по микроскопом. По этим фоточкам считали микропрограммы зашитые в ПЗУ БИС калькулятора.
Когда я прочитал про этого чувака мой пукан прожег стул. Какие всё-таки есть люди уличенные своим хобби с не хилым багажом знаний и в микроэлектроника и в программирование и при этом их возможности совпадают с желаниями.
Ты не ответил на мои вопросы. Какой микроскоп, какое увеличение? Можно ли где-то получить эту матрицу, чтобы нормально переснять? Ну хоть не на текстолите, уже хорошо.
Или, если у нас есть эмулятор, то были ли какие-то тесты на полноту эмуляции?
Размер этой прошивки какой? Что там за единица хранения информации?
Я тут просто реверсилку игорей для спектрума делаю еще.
Они сделали полную эмуляцию, доступны даже не документированные функции.
1. Это кристалл одного из трёх процессоров МК-61. Разумеется, под микроскопом. Сам кристалл примерно 5x5 мм размером.
2. Да, например: http://mk-61.moy.su/emulator.html . Он выводит содержимое памяти, позволяет сохранять состояние, вводить программу в память и т. п. А вот как GDB прихуярить, это я уже не представляю.
3. В своё время были тонны статей и книг на эту тему. Но, правда, изучали реакцию калькулятора на высокоуровневые команды. Теперь есть возможность поебать мозги самому процессору.
4. Та дохуя. Открой тот же код эмулятора, там всё предельно ясно. Более общее описание, например, тут: http://vak.ru/doku.php/proj/calculator/b3-34 (точность не гарантирую, статья ещё "доэмуляторная").
5. Ну это уже в идеале. Для начала хотя б расписать, какие команды или участки кода за что отвечают, как взаимодействуют между собой (структурная схема) и т. п., а уже из этого исходить.
А что он нового скажет? Вся его работа выложена на сайте. К пониманию работы программ калькулятора приблизились не более, чем 25 лет назад благодаря книгам Я. К. Трохименка.
1. хм, получается зум всего где-то 100х? У меня на столе более продвинутый микроскоп.
Вот на пикрелейтеде моем, я так понимаю, и есть сама прошивка? А диагональные царапины - это мудак-микроскопист, или для точной сшивки сканов нанесены? В одном месте непонятно что стало с 1 битом.
2. Ну на самом деле это просто. Есть такая штука как https://sourceware.org/gdb/onlinedocs/gdb/Overview.html#Overview - тут нам русским языком пишут, что достаточно просто:
At a minimum, a stub is required to support the ‘g’ and ‘G’ commands for register access, and the ‘m’ and ‘M’ commands for memory access. Stubs that only control single-threaded targets can implement run control with the ‘c’ (continue), and ‘s’ (step) commands. Stubs that support multi-threading targets should support the ‘vCont’ command. All other commands are optional.
Фактически, нам надо этот самый stub и написать. Слушать порт и рулить эмулем, выставлять доступ к регистрам и памяти. Проблема тут только в том, что я не знаю ни списка регистров, ни модели памяти, ни даже что там в эту память можно писать (тут вспоминается троичная логика от советских инженеров).
Далее можно выполнять код по шагам и смотреть на регистры/память, если есть что-то вроде IP-регистра, то можно писать лог что где исполнилось и чем закончилось, а иначе полные дампы делать каждый такт.
3. Ну если у нас есть уже годный эмуль, что мешает написать простейшую брутфорсилку, которая будет заполнять память/регистры рандомом и тикать процессором? Терабайты интересного выхлопа гарантированы, но что в итоге то? Обычно это юзается для тестирования совместимости с железом.
4. Мне не очень понятен термин "синхропрограмма", упомянутый по ссылке и тут в треде. Конечно, я нашел словарик вида
Программа = последовательность Команд.
Команда = последовательность Синхропрограмм.
Синхропрограмма = последовательность Микрокоманд.
Микрокоманда = набор микроприказов
Но понятнее от этого не стало. И да, двачи как раз по этому слову отлично гуглятся.
5. Для этого нам надо найти аналог call/jmp и смотреть что куда идет, записывая подробный лог. Далее, пишем простенький ассемблер/дизассемблер (или даже сразу сишный компилятор) с возможностью вставлять сгенерированный байткод в произвольное место. Это нам даст возможность переписывать код "на лету" в сишный (руками), ничего не теряя в оригинале, при необходимости проверяя себя тестами хоть после каждой строки. Кстате, только что пришла в голову безумная затея: сделать машину Тьюринга в миниатюре и в нее оттранслировать байткод, а уже в ней проводить дебаг без привязки к железу, но с кучей отладочной инфы и референсам к оригиналу. Можно даже рисовать сканы ПЗУ и подсвечивать что где в данный момент читается.
1. хм, получается зум всего где-то 100х? У меня на столе более продвинутый микроскоп.
Вот на пикрелейтеде моем, я так понимаю, и есть сама прошивка? А диагональные царапины - это мудак-микроскопист, или для точной сшивки сканов нанесены? В одном месте непонятно что стало с 1 битом.
2. Ну на самом деле это просто. Есть такая штука как https://sourceware.org/gdb/onlinedocs/gdb/Overview.html#Overview - тут нам русским языком пишут, что достаточно просто:
At a minimum, a stub is required to support the ‘g’ and ‘G’ commands for register access, and the ‘m’ and ‘M’ commands for memory access. Stubs that only control single-threaded targets can implement run control with the ‘c’ (continue), and ‘s’ (step) commands. Stubs that support multi-threading targets should support the ‘vCont’ command. All other commands are optional.
Фактически, нам надо этот самый stub и написать. Слушать порт и рулить эмулем, выставлять доступ к регистрам и памяти. Проблема тут только в том, что я не знаю ни списка регистров, ни модели памяти, ни даже что там в эту память можно писать (тут вспоминается троичная логика от советских инженеров).
Далее можно выполнять код по шагам и смотреть на регистры/память, если есть что-то вроде IP-регистра, то можно писать лог что где исполнилось и чем закончилось, а иначе полные дампы делать каждый такт.
3. Ну если у нас есть уже годный эмуль, что мешает написать простейшую брутфорсилку, которая будет заполнять память/регистры рандомом и тикать процессором? Терабайты интересного выхлопа гарантированы, но что в итоге то? Обычно это юзается для тестирования совместимости с железом.
4. Мне не очень понятен термин "синхропрограмма", упомянутый по ссылке и тут в треде. Конечно, я нашел словарик вида
Программа = последовательность Команд.
Команда = последовательность Синхропрограмм.
Синхропрограмма = последовательность Микрокоманд.
Микрокоманда = набор микроприказов
Но понятнее от этого не стало. И да, двачи как раз по этому слову отлично гуглятся.
5. Для этого нам надо найти аналог call/jmp и смотреть что куда идет, записывая подробный лог. Далее, пишем простенький ассемблер/дизассемблер (или даже сразу сишный компилятор) с возможностью вставлять сгенерированный байткод в произвольное место. Это нам даст возможность переписывать код "на лету" в сишный (руками), ничего не теряя в оригинале, при необходимости проверяя себя тестами хоть после каждой строки. Кстате, только что пришла в голову безумная затея: сделать машину Тьюринга в миниатюре и в нее оттранслировать байткод, а уже в ней проводить дебаг без привязки к железу, но с кучей отладочной инфы и референсам к оригиналу. Можно даже рисовать сканы ПЗУ и подсвечивать что где в данный момент читается.
Нет, не клон, это оригинальный процессор. Иначе бы не пришлось ебаться с восстановлением кода, поиском документации и т. п. Про уничтожение СССР не слышал? Как вся промышленность пиздой накрылась. Очевидно, все документы там же. Если программные коды самого Бурана проебали, то что говорить о несчастном калькуляторе? Впрочем, в Пиндосии дела не лучше: тогда просто ещё не осознавали исторической ценности программного обеспечения.
А кто сказал, что прораммные коды Бурана проебали? Сто процентов распечатанные лежат на полке в архиве. Просто они никому не всарались и их толком не искали.
В крайнем случае также можно вскрыть БИС и считать ПЗУ.
А весь прикол в том, что код программ в этой впиздец низкоуровневой хуйне и писался. Только древним задротам, которые уже почти все поумирали, было известно, как составлялся этот код. Дед Трохименко (и иже с ним: Захаров, Ромашко, Жижко, Польский, Дьяконов) попытался пролить нам свет на это безобразие в виде книги "ПМК: устройство и пользование", и всё равно нихуя не ясно.
А ничего, что они на магнитной ленте записаны были? Ну давай, почитаем, ежели не пиздишь.
А как же бумажная документация ЕСКД по любому где-то лежит. Сейчас это никому не надо по этому и не ставили цель восстановить.
Почитал Трохименко программируемые микрокалькуляторы устройство и пользование. Это натуральный трэш, нихера непонятно. Дедуля на своей волне был.
1. Годный эмулятор.
На худой конец http://mk-61.moy.su/emulator.html конечно сойдет, но я посмотрел сорсы и у меня ТРИЕДИНСТВО от него началось. Хотелось бы на чем-то более вменяемом и байтоебском (сишка, кресты, да хоть жаба), я конечно могу и портировать, но пока лень.
2. Набор демок / тестов
Помню даже игори делали с ним, но книжка у меня куда-то проебалась.
Мне нужно будет построить набор тестов для проверки корректности, поэтому желательно задействовать все-все-все возможные опкоды калькулятора. Ну и входные/выходные данные.
3. Рассказать мне как это все вводить/выводить, с чем сравнивать, мануал короч как всё это запускать.
4. Пока я не изобрел свои мнемоники вместе со своим ассемблером, дайте уже готовые начинания на эту тему, если у кого-то есть что-то такое на примете.
5. В эмуляторе по ссылке, к примеру, дисплей "захардкожен" прямо в коде, железячный не эмулируется, как быть с этим? Стоит ли изображать 7-сегментные индикаторы или не ворошить это? Я просто пока до конца не разобрался с эмулем, возможно этого там даже нету, а может быть вполне и есть.
1. Ну тот же эмулятор Феликса Лазарева на C++ возьми ( https://code.google.com/p/emu145/downloads/list ). Он там к нему ещё что-то типа дизассемблера прикрутил, но толку с этого нихуя.
2. Тут, например, дохуя программ: http://rosettacode.org/wiki/Category:%D0%9C%D0%9A-61/52 . Специальный тест можно заебенить, но, полагаю, хватит любой программы, занимающей большую часть памяти.
3. Ну вот здесь уже без жабаскриптового эмулятора не обойтись - только он умеет хавать программы в текстовом виде. Вручную вводить заебёшься. Ну или пихать ему программу прямо в память в виде опкодов.
4. Тут надо тебе подробнее вникнуть в логику работы сей машины. Всего ассемблерных команд наберётся столько, сколько битов в микрокоманде. Дизассемблер сделать можно (хотя тоже нюансы есть). На что похож дизассемблированный код, смотри в первом сообщении.
5. Да, Феликса, по ходу, схарило разбираться с остальными элементами К745ИК13, в итоге имеем только код ПЗУ команд, синхропрограмм и микрокоманд. Так что, пожалуй, придётся обойтись тем, что имеем.
> 100x
Нет, 640x. Не знаю, откуда взялись царапины на схеме, но, вроде как, все биты можно различить.
> Программа = последовательность Команд.
> Команда = последовательность Синхропрограмм.
Первое заблуждение, с которым сталкивается изучающий потроха МК-61, - это то, что программа, вводимая человеком, состоит из машинных кодов. Да хуй там, это высокоуровневые инструкции, исполняемые программой, прошитой в ПЗУ. И все элементы памяти, доступной человеку (регистры, стек, программная), - виртуальны.
Сама программа ПЗУ состоит из трёх уровней:
1. 256 команд (не тех, блядь, что человек вводит, бацая по кнопкам; других), состоящих из трёх адресов синхропрограмм;
2. 128 синхропрограмм, состоящих из девяти адресов микрокоманд;
3. 68 микрокоманд.
Микрокоманда - массив битов, каждый из которых обозначает определённое действие (микроприказ).
Основные элементы памяти:
- три массива из 42-х 4-битовых слов M, R и ST;
- регистры S и S1 размером 1 слово;
- биты L, T и П.
Выполнение этой программы происходит следующим образом. Адрес команды, которая подаётся на исполнение, определяется состоянием памяти (R[36] и R[39]). За каждые 42 такта выполняется одна команда, т. е. 42 микрокоманды. Каждый такт происходит передача слова по кольцу из трёх процессоров (которые одинаковы, только программы разные) и двух регистров памяти. За один шаг выполняется 560 команд или 23520 микрокоманд. Шаг примерно соответствует, если не ошибаюсь, элементарной операции (или команде программы, вводимой калькуляторщиком).
>Ну тот же эмулятор Феликса Лазарева на C++ возьми
Ну уже лучше, хоть и всякие pretick-и встречаются. Хотя крестопетушение тоже не идеал.
>3. Ну вот здесь уже без жабаскриптового эмулятора не обойтись - только он умеет хавать программы в текстовом виде. Вручную вводить заебёшься
ТЫЖПОГРОМИЗД, написать эмулятор для эмулятора же можно. Ты только скажи, куда кнопки тыкать, а то я чувствую себя гуманитарием, когда не могу найти даже "=" на клавиатуре. Мне надо объяснение "вот видим такую программу и значит жмем следующие кнопки".
>Феликса, по ходу, схарило разбираться с остальными элементами К745ИК13
Ну это вообще пушка, это как взять и вырезать половину проги и пытаться заставить работать остальное.
>Нет, 640x. Не знаю, откуда взялись царапины на схеме, но, вроде как, все биты можно различить.
Лол, я бы тоже не хуже сделал значит.
Посмотри на большую и толстую царапину, 1 бит под ней скрывается полностью
>(регистры, стек, программная), - виртуальны
Тогда надо разобраться во что реальное оно транслируется и где/как хранится
>Сама программа ПЗУ состоит из трёх уровней
Я правильно понимаю, что это можно представить примерно так:
256 элементов-указателей на структуры по 3 указателя (синхропрограммы), а сами синхропрограммы - это 9 указателей на микрокоманды? Т.е. в итоге мы имеем дерево cmd->synchro->opcode->action? Вместо IP-регистра у нас только указатель в ((R[36]<<4) | R[39]) (или как их складывать? кто старший?)... на что? Где у нас пользовательская команда, которую надо интерпретировать? А дальше просто шароебим по массиву указателей на команды и быстро-быстро шароебим по дереву, исполняя код?
> Ты только скажи, куда кнопки тыкать, а то я чувствую себя гуманитарием, когда не могу найти даже "=" на клавиатуре.
Да это хуйня, 10-летние школьники под него программы писали (правда, советские; ЕГЭ-бакалаврам-быдлокодерам это не под силу). Вся суть в том, что калькулятор работает в бесскобочной нотации. Т. е., чтобы посчитать, напр., "3 4", надо нажать "3", поднять 3 вверх в стеке кнопкой "В^", потом "4", и тогда "", результат на экране (регистр X). Отображение стека в эмуляторе очень хорошо помогает разобраться в логике работы этой машины. Насчёт программ тоже просто: F->ПРГ, дальше вводишь программу, каждая команда вводится так же, как если бы считал вручную, обратно - F-АВТ; запускать - В/О (сбросить счётчик команд) и С/П (стоп/пуск).
> Ну уже лучше, хоть и всякие pretick-и встречаются. Хотя крестопетушение тоже не идеал.
А чем тебя жидокрипт не устраивает? Всё по-русски написано, без всякой мудотени, на мой взгляд, всё предельно ясно и легко модифицируется.
> Ну это вообще пушка, это как взять и вырезать половину проги и пытаться заставить работать остальное.
Видеодрайвер, драйвер клавиатуры и т. п. живут своей отдельной жизнью, будто это самостоятельные устройства (см. книгу деда Трохименка). Так что потеря, по-моему, не очень значительная (хотя хотелось бы, конечно, иметь и их). Тут надо сперва поинтересоваться, собственно, какого хуя Феликс забил на них хуй, м. б., действительно, оно того не стоило?
> Тогда надо разобраться во что реальное оно транслируется и где/как хранится
Где и как хранится - это понятно (смотри в эмуляторе функцию "Заполнить_поля", перестановки верны для определённого такта, а так все данные вращаются в кольце). А вот как и какими командами транслируются, управляются и т. п. - это уже сложнее.
> 256 элементов-указателей на структуры по 3 указателя
Каких, нахуй, указателей на указатели? Они и есть структуры по три указателя (плюс один бит, использующийся исполнителем). Ну а так, да: команды->синхропрограммы->микрокоманды->микроприказы.
> или как их складывать? кто старший?
39-й старше, смотри эмулятор.
> на что?
Ну на команду, а что у нас ещё-то есть?
> Где у нас пользовательская команда
В смысле?
> А дальше просто шароебим по массиву указателей на команды
Где ты увидел массив указателей на команды? Дерево (для каждой команды) строить, полагаю, нахуй не сдалось. Команда выбирается по результату отработки предыдущей команды. Каждой команде соответствуют одни и те же микрокоманды (хотя содержание микроприказов 4-х из них зависит от состояния регистров). В первом сообщении показана попытка преобразования команды в последовательность микрокоманд. Хуёво вышло с точки зрения человека, пытающегося понять, как это работает.
Попробую довести до ума и выложить свою версию дизассемблера на базе жс-эмулятора.
> Ты только скажи, куда кнопки тыкать, а то я чувствую себя гуманитарием, когда не могу найти даже "=" на клавиатуре.
Да это хуйня, 10-летние школьники под него программы писали (правда, советские; ЕГЭ-бакалаврам-быдлокодерам это не под силу). Вся суть в том, что калькулятор работает в бесскобочной нотации. Т. е., чтобы посчитать, напр., "3 4", надо нажать "3", поднять 3 вверх в стеке кнопкой "В^", потом "4", и тогда "", результат на экране (регистр X). Отображение стека в эмуляторе очень хорошо помогает разобраться в логике работы этой машины. Насчёт программ тоже просто: F->ПРГ, дальше вводишь программу, каждая команда вводится так же, как если бы считал вручную, обратно - F-АВТ; запускать - В/О (сбросить счётчик команд) и С/П (стоп/пуск).
> Ну уже лучше, хоть и всякие pretick-и встречаются. Хотя крестопетушение тоже не идеал.
А чем тебя жидокрипт не устраивает? Всё по-русски написано, без всякой мудотени, на мой взгляд, всё предельно ясно и легко модифицируется.
> Ну это вообще пушка, это как взять и вырезать половину проги и пытаться заставить работать остальное.
Видеодрайвер, драйвер клавиатуры и т. п. живут своей отдельной жизнью, будто это самостоятельные устройства (см. книгу деда Трохименка). Так что потеря, по-моему, не очень значительная (хотя хотелось бы, конечно, иметь и их). Тут надо сперва поинтересоваться, собственно, какого хуя Феликс забил на них хуй, м. б., действительно, оно того не стоило?
> Тогда надо разобраться во что реальное оно транслируется и где/как хранится
Где и как хранится - это понятно (смотри в эмуляторе функцию "Заполнить_поля", перестановки верны для определённого такта, а так все данные вращаются в кольце). А вот как и какими командами транслируются, управляются и т. п. - это уже сложнее.
> 256 элементов-указателей на структуры по 3 указателя
Каких, нахуй, указателей на указатели? Они и есть структуры по три указателя (плюс один бит, использующийся исполнителем). Ну а так, да: команды->синхропрограммы->микрокоманды->микроприказы.
> или как их складывать? кто старший?
39-й старше, смотри эмулятор.
> на что?
Ну на команду, а что у нас ещё-то есть?
> Где у нас пользовательская команда
В смысле?
> А дальше просто шароебим по массиву указателей на команды
Где ты увидел массив указателей на команды? Дерево (для каждой команды) строить, полагаю, нахуй не сдалось. Команда выбирается по результату отработки предыдущей команды. Каждой команде соответствуют одни и те же микрокоманды (хотя содержание микроприказов 4-х из них зависит от состояния регистров). В первом сообщении показана попытка преобразования команды в последовательность микрокоманд. Хуёво вышло с точки зрения человека, пытающегося понять, как это работает.
Попробую довести до ума и выложить свою версию дизассемблера на базе жс-эмулятора.
> Посмотри на большую и толстую царапину, 1 бит под ней скрывается полностью
Там, где она начинается, чётко видно, что никакого бита там нету.
Вместо трёх процессоров и двух памятей, образующих кольцо (частью которого является регистр M (магистраль)), он замкнут на себя. Чтобы получить ЕГГОГ, после стабилизации состояния разрядов индикатора достаточно нажать клавишу запятой (нижний ряд, вторая слева).
> Пост не был найден. Удалён или что-то сломалось.
Кто такую красавицу пидорнул? Это, небось, автопортрет петушка-автора в период анального расцвета был. Прям неловко.
это злобный модератор удалил все мои посты
но он уже понял свою ошибку, и как видишь, бан снят
эх, жаль то сообщение
Ну так если ты уёбок, кудахтающий в сторону МК-61, то это вполне закономерно.
Ну так а я о чём? Или хохлы, по-твоему, не русские?
По-русски, мудила.
Тема, между тем, серьёзная, зря замолкли, петушки.
Зацените, к примеру:
[code]ВИД
Дробь- = НАБОР числитель, знаменатель: ШИРЦЕЛ КОН;
ЗАДАЧА НОД(a, b: ШИРЦЕЛ): ШИРЦЕЛ;
УКАЗ
ПОКА (a # 0) И (b # 0) ВЫП
ЕСЛИ a >= b ТО
a := a ОСТАТОК b
ИНАЧЕ
b := b ОСТАТОК a
КОН
КОН;
ВОЗВРАТ a + b
КОН НОД;
ЗАДАЧА НОК(a, b: ШИРЦЕЛ): ШИРЦЕЛ;
УКАЗ
ВОЗВРАТ a b ДЕЛИТЬ НОД(a, b)
КОН НОК; [/code]
Это ж просто охуенно! Почему быдлятина так не любит русский язык?
На лексическую базу при уёбищном синтаксисе глубоко посрать. А вот если синтаксис хорош, то хуёвая лексическая база может скатить его в говно. Например, из-за СКЛОНЕНИЙ.
Не знаю почему, но после просмотра этой фотографии испытал ужас, ведь это невероятно - есть железяка, есть тонны документов по ней, но никто не знает как она работает.
У меня был знакомый, заканчивал ВУЗик по спецiальности "микроэлектроника", он знал.
Вообще, погугли верилог и пикад.
К сожалению, примерно так оно и есть, хотя документов не так уж и много сохранилось - несколько книжек и статей. Попытался вникнуть в эту поебень, пошагово изучая работу процессора, чуть перелом мозга не получил, потом пару дней отходил.
>>430103
Вряд ли. Т. е. он, может, и знал бы, как процессор исполняет команды (это и мы знаем), как устроен, на какой базе и по каким технологиям работает и т. п., но как работает программа ПЗУ, хуй бы он понял.
Как насичёт Васика?
R[15] = R[18]
a := a ОСТАТОК b
ИНАЧЕ
b := b ОСТАТОК a
sdfd 3454
КОН
КОН;
ВОЗВРАТ a + b
R[18] = R[21]
R[21] = R[24]
a := a ОСТАТОК b
ИНАЧЕ
b := b ОСТАТОК a
КОН
КОН;
ВОЗВРАТ a + b
34534 sfsf
R[24] = R[27]
24 dfgfd
инфа 100
Что за a и b, что за sdsf и т. п., блядь?
Каждые 42 такта работы исполнителя выбирается на основании текущего состояния команда, которая содержит три адреса синхропрограмм, по очереди использующиеся в течение этих 42-х тактов. У каждой синхропрограммы своё назначение.
Синхропрограмма представляет собой 9 адресов 28-битных микрокоманд, каждый бит которой определяет некоторое элементарное действие, исполняющиеся над памятью исполнителя в зависимости от номера такта и текущего состояния регистров.
Память исполнителя представлена тремя основными регистрами M, R и ST, состоящими из 42-х 4-битный слов, регистрами S и S1 по 1-му слову, а также 1-битными флагами L, T и П.
Также предусмотрена возможность обмена с другими исполнителями через 1-словные регистры входа и выхода, вывода числа на индикатор через регистр R и ввода с клавиатуры, кнопки которой представляются двумя переменными X и Y.
Полную схему работы см. тут: http://pastebin.com/TxAJa8hU
Да неужели? После того, как Франции порвали жопу до ушей в 1812-14, такое высказывание звучит нелепо.
>Солженицын ГУЛАГ
Да так и есть, количество жертв завышено на порядки.
http://www.youtube.com/watch?v=M_JYbSql3Lw
>>442605
Солженицын - обычный обиженник. Съебался с фронта на зону, там его, видимо, опустили, потому и начал загонять про 100 млн расстрелянных и прочую хуйню, желая отомстить "обидчикам". Но, с другой стороны, интересный источник по теме, если рассматривать его писанину как в основе своей художественную.
В ходе сих рассуждений удалось выявить несколько факторов, влияющих на это стадо дебилов:
1) русскость языка, калькулятора, его разработчиков и пользователей;
2) ограниченность ресурсов, вынуждающее шевелить мозгами, которых у быдла нету;
3) язык, напоминающий низкоуровневый автокод, хотя по сути он нихуя не низкоуровневый.
Кто что ещё вспомнит, пишите, это очень интересное и занятное явление.
1) славшит не нужен и их недоязык тоже
2) анальное трюкачество вместо свободного выражения мысли в коде; вместо описания того что нужно сделать, описываешь шаги как это сделать, детсад блять, развлечение типа кубика-рубика
3) вырвиглазныйй пиздец, не удивительно, в совке всё было уёбищным, такая традиция, не для людей же делали, для совков.
Ни чем не лучше, НР-11, 41 круче, даже принтер для них был. МК-61 такой какой он есть, каким мы его узнали в 1987 году, это первая конча стекающая с конца, это замусоленный до дыр Техника молодежи, это понос от турнепса и многое другое
Да блядь совки не люди, а вот анимедрочеры люди - всё для них и сисярп и хуй в жопу
Но вот эти упоротые люди, который пилят микросхемы и насилуют мертвые процессоры, зачем им это надо? Лучше бы свое что-то создавали.
это у них из-за еггога. Большинство из этих уродов виртуозно с паяльником обращаются и таки создают своё, но в большинстве случаев за жрат
Молодёжь, может, не поймёт весь кайф от существования эмулятора, потому рекомендую ознакомиться с журналами тех лет ( http://www.emulator3000.org/rus-c3.htm , внизу страницы, или тут - http://arbinada.com/pmk/node/1049 ), весьма душевное чтиво.
Это ты хорошо понял, только тебя не понимаю.
>>445614
Видел продается ТМ, не раз рука тянулась взять посмотреть, так и не взял. Последний раз читал его в 1992 году, тогда началась еще хуйня с объединением журнала за 2 месяца в один и журналы в 2 раза тоньше были, и реклама непонятной хуйни на полжурнала. Журнал с 1985 выписывали.
Это Б3-34, в МК-61 ещё один процессор добавлен, но суть та же - ебучее сине-зелёное кольцо, по которому они гоняют поток информации, по 1 биту за такт. А прикол в том, что если регистры памяти на аппаратном уровне толкают эту струю, то процессоры, судя по всему, - программно (42-словный регистр M, см. http://mk-61.moy.su/potroha.html ).
Симулятор шлюхи:
4\tхП1\tПхД\t8\tС/П\tКППА\tПх6\tх\tВ↑\tКсч
х\tхП0\tПхЕ\t–\tFx≥o\t19\tFL1\t12\tКПх1\t5
Пх1\t–\tПхЕ\t+\tКинв\tхП2\tПх3\tхП1\tПх2\tС/П
В↑\tПх0\t–\tFx≥o\t38\tFL1\t28\tКБП8\t↔\t/–/
КППА\tПх4\tхП1\tFL1\t43\tКсч\t3\tF1/x\t–\tFx<o
60\tКсч\tПх6\tх\tK[х]\tПх6\t+\tКППА\tПхВ\tС/П
Ксч\t9\tF1/x\t–\tKx<oE\tПхС\tС/П\tКППА\t+\tКсч
Пх0\tх\t–\tKx≥oE\tПх9\tКППА\tПх7\tхП0\tПхС\tС/П
FL0\t78\t6\tС/П\tКППА\tПх6\t–\tF√\tКБПЕ\tхП2
ПхД\tПх2\t–\tхПД\tF√\tПх2\tВ/О
__Регистры__:
терпеливость клиента (2-7) хП3; продолжительность акта, цикл (4-8) хП4; коэффициент доброты клиента (25-27) хП6; срок наказания (4-6) хП7; штраф (100) хП9; 200 (деньги) хПД; 88008 В↑ 22032 KV K{x} ВП 4 хПВ ↔ 22022 KV K{x} ВП 4 хПС; 89 хПА; 82 хП8; 100 хПЕ.
__Начало__: В/О С/П...
RX="8" - сутенёр (RY="твои деньги"). Вводишь деньги сутенёру, С/П.
RX="8.N" - сутенёр привёл N - клиента. Вводишь свою цену, С/П. Если клиент не согласен, он остаётся R3 раз, а если не договорились - RX="6" - разговор продолжает мафия. Вводишь откуп, С/П. Если мало - RX="ЕГГОГ" - ты погибла, иначе RX="8" и т.д.
Если договорились - обслуживаешь клиента (в динамическом режиме мерцает "70000000" - пол/акт), получаешь деньги и проходишь проверки на вензаболевания и в ментовке.
Если заразилась, RX="–03–" - Скорая Сволочь. RY="уже заплаченные деньги за лечение". С/П.
Если RX="–02–" - попалась в ментовку. Вводишь взятку, С/П. Если менты согласны, то попадаешь к сутенёру, а если нет - то сидишь, а затем оказываешься в лапах мафии...
Симулятор шлюхи:
4\tхП1\tПхД\t8\tС/П\tКППА\tПх6\tх\tВ↑\tКсч
х\tхП0\tПхЕ\t–\tFx≥o\t19\tFL1\t12\tКПх1\t5
Пх1\t–\tПхЕ\t+\tКинв\tхП2\tПх3\tхП1\tПх2\tС/П
В↑\tПх0\t–\tFx≥o\t38\tFL1\t28\tКБП8\t↔\t/–/
КППА\tПх4\tхП1\tFL1\t43\tКсч\t3\tF1/x\t–\tFx<o
60\tКсч\tПх6\tх\tK[х]\tПх6\t+\tКППА\tПхВ\tС/П
Ксч\t9\tF1/x\t–\tKx<oE\tПхС\tС/П\tКППА\t+\tКсч
Пх0\tх\t–\tKx≥oE\tПх9\tКППА\tПх7\tхП0\tПхС\tС/П
FL0\t78\t6\tС/П\tКППА\tПх6\t–\tF√\tКБПЕ\tхП2
ПхД\tПх2\t–\tхПД\tF√\tПх2\tВ/О
__Регистры__:
терпеливость клиента (2-7) хП3; продолжительность акта, цикл (4-8) хП4; коэффициент доброты клиента (25-27) хП6; срок наказания (4-6) хП7; штраф (100) хП9; 200 (деньги) хПД; 88008 В↑ 22032 KV K{x} ВП 4 хПВ ↔ 22022 KV K{x} ВП 4 хПС; 89 хПА; 82 хП8; 100 хПЕ.
__Начало__: В/О С/П...
RX="8" - сутенёр (RY="твои деньги"). Вводишь деньги сутенёру, С/П.
RX="8.N" - сутенёр привёл N - клиента. Вводишь свою цену, С/П. Если клиент не согласен, он остаётся R3 раз, а если не договорились - RX="6" - разговор продолжает мафия. Вводишь откуп, С/П. Если мало - RX="ЕГГОГ" - ты погибла, иначе RX="8" и т.д.
Если договорились - обслуживаешь клиента (в динамическом режиме мерцает "70000000" - пол/акт), получаешь деньги и проходишь проверки на вензаболевания и в ментовке.
Если заразилась, RX="–03–" - Скорая Сволочь. RY="уже заплаченные деньги за лечение". С/П.
Если RX="–02–" - попалась в ментовку. Вводишь взятку, С/П. Если менты согласны, то попадаешь к сутенёру, а если нет - то сидишь, а затем оказываешься в лапах мафии...
Симулятор проститутки:
Пх2\tхП1\tКППС\tKx=oA\tКсч\tПх5\tх\tКБПС\t5\tх
Flg\tПх5\t+\tхП5\tКППС\tKx=oB\tПх4\tF√\t/–/\tБП
25\t9\tх\tF√\tFln\tПх4\t+\tхП4\tКППС\t7
÷\tFlg\tFex\tПх3\t+\tхП3\tВ↑\tПх4\tх\tВ↑
Ксч\t1\t+\t÷\tK[х]\tхП6\tF√\t–\tхП3\tF√
Ксч\t5\t1\tх\tПх6\tх\tПхД\t+\tхПД\tКсч
ПхД\tх\tПхД\tС/П\tFx≥o\t69\t–\tхПД\tКБП8\tКсч
ПхВ\tх\tПх5\t–\t/–/\tхП5\tKx<o8\tПх4\tF√\tхП4
Пх3\tF√\tхП3\tПхД\tF√\tхПД\tКБП8\tПхД\tПх1\tС/П
хП9\tПхД\t↔\t–\tхПД\tКПх1\tПх9\tВ/О
__Регистры__:
1 K– ВП хП2; Сх хП8; 8 хПА; 21 хПВ; 87 хПС; 13 хПЕ;
100 (деньги) хПД.
__Начало__: В/О С/П...
RX="Е" (блок карате), RY="деньги". Чтобы отбиваться от рэкетиров, надо ходить в секцию карате. Ввод: деньги на обучение, С/П.
RX="Г" (блок одежды), RY="деньги". Для привлечения клиентов надо получше одеться. Ввод денег на одежду, С/П.
RX="С" (блок лечения), RY="деньги". Для профилактики и лечения профессиональных заболеваний необходимо выделить деньги. Ввод: деньги на лечение, С/П.
RX="деньги, которые у Вас есть после этой ночи". RY="требования рэкетиров". Если силёнок маловато, можно отдать: /-/ С/П. Если Ваших сил будет больше, то всё нормально, только R5 уменьшится на кол-во силы рэкетиров. Если победят рэкетиры - они отнимут часть денег и порвут одежду, естественно, здоровье тоже ухудшится от побоев, а R5 будет даже отрицательным.
Кол-во клиентов зависит от качества одежды и от здоровья, но чем больше клиентов, тем хуже здоровье. Если не давать денег на одежду и карате, то одежда изнашивается, а выучка ухудшается.
Вводить 0 руб. на лечение нельзя. Если здоровье станет отрицательным, героиня умирает (RX="ЕГГОГ").
Обе игры 1991-го года. Точно про матерей ваших. Ещё симулятор публичного дома есть, но в него, скорее, ваши анальные манагеры-надзиратели играли.
Симулятор проститутки:
Пх2\tхП1\tКППС\tKx=oA\tКсч\tПх5\tх\tКБПС\t5\tх
Flg\tПх5\t+\tхП5\tКППС\tKx=oB\tПх4\tF√\t/–/\tБП
25\t9\tх\tF√\tFln\tПх4\t+\tхП4\tКППС\t7
÷\tFlg\tFex\tПх3\t+\tхП3\tВ↑\tПх4\tх\tВ↑
Ксч\t1\t+\t÷\tK[х]\tхП6\tF√\t–\tхП3\tF√
Ксч\t5\t1\tх\tПх6\tх\tПхД\t+\tхПД\tКсч
ПхД\tх\tПхД\tС/П\tFx≥o\t69\t–\tхПД\tКБП8\tКсч
ПхВ\tх\tПх5\t–\t/–/\tхП5\tKx<o8\tПх4\tF√\tхП4
Пх3\tF√\tхП3\tПхД\tF√\tхПД\tКБП8\tПхД\tПх1\tС/П
хП9\tПхД\t↔\t–\tхПД\tКПх1\tПх9\tВ/О
__Регистры__:
1 K– ВП хП2; Сх хП8; 8 хПА; 21 хПВ; 87 хПС; 13 хПЕ;
100 (деньги) хПД.
__Начало__: В/О С/П...
RX="Е" (блок карате), RY="деньги". Чтобы отбиваться от рэкетиров, надо ходить в секцию карате. Ввод: деньги на обучение, С/П.
RX="Г" (блок одежды), RY="деньги". Для привлечения клиентов надо получше одеться. Ввод денег на одежду, С/П.
RX="С" (блок лечения), RY="деньги". Для профилактики и лечения профессиональных заболеваний необходимо выделить деньги. Ввод: деньги на лечение, С/П.
RX="деньги, которые у Вас есть после этой ночи". RY="требования рэкетиров". Если силёнок маловато, можно отдать: /-/ С/П. Если Ваших сил будет больше, то всё нормально, только R5 уменьшится на кол-во силы рэкетиров. Если победят рэкетиры - они отнимут часть денег и порвут одежду, естественно, здоровье тоже ухудшится от побоев, а R5 будет даже отрицательным.
Кол-во клиентов зависит от качества одежды и от здоровья, но чем больше клиентов, тем хуже здоровье. Если не давать денег на одежду и карате, то одежда изнашивается, а выучка ухудшается.
Вводить 0 руб. на лечение нельзя. Если здоровье станет отрицательным, героиня умирает (RX="ЕГГОГ").
Обе игры 1991-го года. Точно про матерей ваших. Ещё симулятор публичного дома есть, но в него, скорее, ваши анальные манагеры-надзиратели играли.
Теперь играть в шлюх и проституток будет ещё веселее!
под лаком окисление пошло, за многие годы влага прошла через верхнюю поверхность платы, текстолит протек(
На такой ЖЪОЛТИЙ НОЖЬКА я бы тоже подрочил.
Ага, и ровно на микросхемы попал. Скорее уж, студенты-практиканты перевозбудились от избытка эмоций. Те самые, которые теперь за еду быдлокодят.
Игра "Хач-трюкач":
Сx П5 5 П0 СЧ 5 [x] 1 +
KП0 ИП5 2 10^x + П5 ИП0 1 -
x=0 04 ИП5 ВП /-/ 7 ^ 8 + ИПC
\/ {x} ^ ВП 7 С/П /-/ ^ 5 +
П7 KИП7 6 1/x ^ СЧ - x<0 55
БП 81 СЧ ИП8 - x<0 64 ИП9 2 /
[x] П9 БП 82 ИП8 / [x] x=0 75 ИП9
5 - П9 БП 81 ИП9 3 + БП
81 KИП6 ИП9 /-/ x>=0 88 ИПD С/П ИП6 1
0 - x=0 96 ИПE С/П ИП9 ИП6 С/П БП
00
Сюжет. Хач Ослан узнал, что из аула Чурбанпиздыевка сбежал ишак, которого следует искать на вершине близлежащей сопки.
К вершине есть четыре пути, которые на каждом ярусе холма пересекаются, и можно выбрать любой путь.
Однако осла также ищет его прежний хозяин Гусен. При встрече с ним здоровье героя уменьшается на 5 единиц, однако, одолев Гусена, он продолжает движение наверх.
Также он может столкнуться с призраком русского солдата, при этом здоровье уменьшается вдвое, а ход не засчитывается.
По пути можно найти шаурму (+6 здоровья) и ослиную мочу (+3 здоровья).
Ослан способен определить вероятность нахождения вверху некого объекта (от 1 до 5), но не может знать, что именно находится на этом пути.
Ход: С/П, на экране 4 значения вероятности, соответветствующие путям в гору; выбрать один из них (1 - 4), С/П.
После на индикаторе (РX) - уровень (ярус), в РY - здоровье.
Цель игры - достигнуть вершины (10-й уровень) и отъебать осла, при этом на экране появится сообщение: "-0CL0EB".
Если хач повержен, появляется сообщение "90L60E6".
Предварительный ввод:
8 8 0 8 8 0 8 8 ^ 8 2 0 4 3 0 6 0 \/ {x} ^ ВП 7 ПE
8 9 0 8 6 0 8 6 ^ 8 0 0 3 0 0 6 0 \/ {x} ^ ВП 7 ПD
8 0 8 0 8 0 8 ^ 8 0 2 0 2 0 2 \/ ПC
1 П6
1 0 П9
4 1/x П8
С/П
Игра "Хач-трюкач":
Сx П5 5 П0 СЧ 5 [x] 1 +
KП0 ИП5 2 10^x + П5 ИП0 1 -
x=0 04 ИП5 ВП /-/ 7 ^ 8 + ИПC
\/ {x} ^ ВП 7 С/П /-/ ^ 5 +
П7 KИП7 6 1/x ^ СЧ - x<0 55
БП 81 СЧ ИП8 - x<0 64 ИП9 2 /
[x] П9 БП 82 ИП8 / [x] x=0 75 ИП9
5 - П9 БП 81 ИП9 3 + БП
81 KИП6 ИП9 /-/ x>=0 88 ИПD С/П ИП6 1
0 - x=0 96 ИПE С/П ИП9 ИП6 С/П БП
00
Сюжет. Хач Ослан узнал, что из аула Чурбанпиздыевка сбежал ишак, которого следует искать на вершине близлежащей сопки.
К вершине есть четыре пути, которые на каждом ярусе холма пересекаются, и можно выбрать любой путь.
Однако осла также ищет его прежний хозяин Гусен. При встрече с ним здоровье героя уменьшается на 5 единиц, однако, одолев Гусена, он продолжает движение наверх.
Также он может столкнуться с призраком русского солдата, при этом здоровье уменьшается вдвое, а ход не засчитывается.
По пути можно найти шаурму (+6 здоровья) и ослиную мочу (+3 здоровья).
Ослан способен определить вероятность нахождения вверху некого объекта (от 1 до 5), но не может знать, что именно находится на этом пути.
Ход: С/П, на экране 4 значения вероятности, соответветствующие путям в гору; выбрать один из них (1 - 4), С/П.
После на индикаторе (РX) - уровень (ярус), в РY - здоровье.
Цель игры - достигнуть вершины (10-й уровень) и отъебать осла, при этом на экране появится сообщение: "-0CL0EB".
Если хач повержен, появляется сообщение "90L60E6".
Предварительный ввод:
8 8 0 8 8 0 8 8 ^ 8 2 0 4 3 0 6 0 \/ {x} ^ ВП 7 ПE
8 9 0 8 6 0 8 6 ^ 8 0 0 3 0 0 6 0 \/ {x} ^ ВП 7 ПD
8 0 8 0 8 0 8 ^ 8 0 2 0 2 0 2 \/ ПC
1 П6
1 0 П9
4 1/x П8
С/П
MK61();
} catch (ЕГГОГ) {
} finally {
bump();
}
- Я тебе принес покодить-то!
- Чё ты мне покодить принёс, чё ты, мудак, что ль, бля?! Хули ты вызвал… хули ты говном-то вымазался, мудак, блядь?!
- Я уж покодил, я тебе...
- Пидорас, блядь! Сука, блядь!
- Братишка, ты что!
- Убери это говно отсюда, блядь!
- Я покодил уже!..
- Ёб твою мать, блядь, и весь пол засрал, блядь!
- Хотел тебе покодить-то!..
- Мудак, блядь, ну ты мудак, блядь, я тебя сейчас убью, нахуй! Я тебя, блядь, сейчас убью нахуй, блядь!
...
- Сладкий код!
- Уйди, я сказал, поставь клавиатуру, блядь, иди мойся, пидорас, блядь, убью нахуй. Сука, блядь! Как ты доебал меня!
- Код!.. Я код сру, блядь!
- Фу-у, блядь! Всё засрал, блядь, а! Уф, блядь, какой вонизм, а!
...
- Эх! Эх, вот в деревнях-то было всё! Ты в дерев...
- Начальник, бля, уберите от меня этого мудака!!!
- В деревнях писали всё, это самое, не тока!
- Чё писали? Ты чё, мудак что ль, кто писал-то, блядь?
- Мой код писали!
- Код писали, но говно-то не писали! Ты чё, с ума сошёл, ёпта? Совсем дошёл, бля! Мойся, я сказал!
Так, чтобы перевезти несколько мешков с дерьмом быдлокодер возьмёт не доску, чтобы приделать к ней колёса, прибить ручку (ведь тут надо хотя бы знать, с какой стороны молоток взять) и спокойно возить, а реактивный двигатель, который засунет в жопу ишаку и будет удивляться, хули оно не летает.
Аналогию видим и в высказываниях о ненужности математики для кодеров-программеров. Конечно, не нужна, иначе это уже будут не совсем быдлокодеры. Возьмём классический пример. Как эти ебланушки вычислят количество 10-ных разрядов в натуральном числе?
Типичным решением будет нечто вроде:
\t ЕСЛИ число < 10 ТО
\t \tдлина = 1
\t АЕСЛИ число < 100 ТО
\t \tдлина = 2
\t АЕСЛИ число < 1000 ТО
\t \tдлина = 3
\t ...
\t ИНАЧЕ длина = 8 КОН;
\t Ко_ко_ко()
Но более продвинутых деятелей, своеобразных представителей "среднего класса" от быдлокодерства, такая нерациональная трата ресурсов клавиатуры смутит, и они напишут короче:
\t строка = ВСтроку(число);
\t длина = ДЛИНА(строка);
\t Куд_кудах()
Не удивлюсь, что, дочитав до этого момента, многие из вас даже и не поймут, что в этом хуёвого. А вот быдлокодер-задрот, помня анальные кары школьных лет в виде ЕГЭ и порванное за диплом бакалавра дупло, решит проблему в духе школьных задачек ("так нас учили"):
\t длина = 0;
\t ПОКА число > 0 ВЫП
\t \tчисло = число ДЕЛИТЬ 10;
\t \tУВЕЛИЧИТЬ(длина)
\t КОН;
\t Ку_ка_ре_ку()
Наиболее упоротые будут комбинировать и усложнять эти методы, но это уже индусская элита быдлокодинга. Как же сделает, например, программист МК-61? Такая нужда, например, была при написании машины Маркова под сей калькулятор...
\t ИП9\tlg\t[x]\t1\t+
Десятичный логарифм, взятие целой части, инкремент - три команды. Но откуда жертвам образовательных реформ, анального самообучения и оральной дрессировки знать про какие-то там лохарифмы и т. п.? Ведь чтобы писать говнокод, знать даже элементарную математику не просто не нужно, а вредно!
Так, чтобы перевезти несколько мешков с дерьмом быдлокодер возьмёт не доску, чтобы приделать к ней колёса, прибить ручку (ведь тут надо хотя бы знать, с какой стороны молоток взять) и спокойно возить, а реактивный двигатель, который засунет в жопу ишаку и будет удивляться, хули оно не летает.
Аналогию видим и в высказываниях о ненужности математики для кодеров-программеров. Конечно, не нужна, иначе это уже будут не совсем быдлокодеры. Возьмём классический пример. Как эти ебланушки вычислят количество 10-ных разрядов в натуральном числе?
Типичным решением будет нечто вроде:
\t ЕСЛИ число < 10 ТО
\t \tдлина = 1
\t АЕСЛИ число < 100 ТО
\t \tдлина = 2
\t АЕСЛИ число < 1000 ТО
\t \tдлина = 3
\t ...
\t ИНАЧЕ длина = 8 КОН;
\t Ко_ко_ко()
Но более продвинутых деятелей, своеобразных представителей "среднего класса" от быдлокодерства, такая нерациональная трата ресурсов клавиатуры смутит, и они напишут короче:
\t строка = ВСтроку(число);
\t длина = ДЛИНА(строка);
\t Куд_кудах()
Не удивлюсь, что, дочитав до этого момента, многие из вас даже и не поймут, что в этом хуёвого. А вот быдлокодер-задрот, помня анальные кары школьных лет в виде ЕГЭ и порванное за диплом бакалавра дупло, решит проблему в духе школьных задачек ("так нас учили"):
\t длина = 0;
\t ПОКА число > 0 ВЫП
\t \tчисло = число ДЕЛИТЬ 10;
\t \tУВЕЛИЧИТЬ(длина)
\t КОН;
\t Ку_ка_ре_ку()
Наиболее упоротые будут комбинировать и усложнять эти методы, но это уже индусская элита быдлокодинга. Как же сделает, например, программист МК-61? Такая нужда, например, была при написании машины Маркова под сей калькулятор...
\t ИП9\tlg\t[x]\t1\t+
Десятичный логарифм, взятие целой части, инкремент - три команды. Но откуда жертвам образовательных реформ, анального самообучения и оральной дрессировки знать про какие-то там лохарифмы и т. п.? Ведь чтобы писать говнокод, знать даже элементарную математику не просто не нужно, а вредно!
>Программирование МК-61
>философский подтекст
>опыт аскетических духовных практик
>калькулятор
>глубины и уровни материи
>икрокод, прошитый в ПЗУ
>агностицизм
>иллюзорность свободы воли
>синхропрограммы и микрокоманды
>христианского представления о Боге
>триединой русской нации
>низкоуровневый автокод
>высокоуровневые инструкции
>единства и борьбы противоположностей
>образ колеса сансары
>программирование
Вы прослушали монолог шизоидного дауна.
В случае с if там хардкод что не приемлемо, тем более на калькуляторе. А насчет того что деление быстрее то это достаточно спорно. Хотя калькулятор использует двоично-десятичные числа, возможно там можно соптимизировать деление на 10 - оно должо быть очень быстрым (если возможно), но скорее всего на больших количествах разрядов скорость все равно будет ниже, ну и команд чуть побольше нужно (так как цикл с условием), что тоже может быть важно.
Ну я про x86 говорил в основном. Или у вас на калькуляторе есть вот эти:
> ВСтроку
> ДЛИНА
??? А на обычном компе решение в лоб будет быстрее. Ну или вариант с битоеблей из всем известной статьи.
>аппаратное решение
Смотря как там логарифм реализован, там же ограниченые ресурсы, однобитный сумматор и т.д. может там просто ряды сумируют без особых апаратных изысков - место-то на схеме ограничено.
Алгоритм с делением:
П0 Сx П4
ИП0 1 0 - /-/ x<0 17
ИП0 1 0 / [x] П0 КИП4
ИП4 С/П
Не особо изощрялся в оптимизации, но так больше на быдлокодерский стиль похоже. Немного оптимизировать можно, например, так:
П0 Сx П4
КИП4 ИП0 1 0 / [x] П0 x=0 03
ИП4 С/П
Итак, 19 команд в первом случае и 14 во втором. Выполним на эмуляторе код 10 раз для числа 123:
1 0 П3 1 2 3
...
L3 03 С/П
Первый код - 20 секунд. Второй - 31 секунда.
Теперь возьмём логарифм.
1 0 П3 1 2 3
П0 lg [x] 1 +
L3 03 С/П
12 секунд. 5 команд. Не использует дополнительные регистры и переходы. Есть разница?
Алгоритм с делением:
П0 Сx П4
ИП0 1 0 - /-/ x<0 17
ИП0 1 0 / [x] П0 КИП4
ИП4 С/П
Не особо изощрялся в оптимизации, но так больше на быдлокодерский стиль похоже. Немного оптимизировать можно, например, так:
П0 Сx П4
КИП4 ИП0 1 0 / [x] П0 x=0 03
ИП4 С/П
Итак, 19 команд в первом случае и 14 во втором. Выполним на эмуляторе код 10 раз для числа 123:
1 0 П3 1 2 3
...
L3 03 С/П
Первый код - 20 секунд. Второй - 31 секунда.
Теперь возьмём логарифм.
1 0 П3 1 2 3
П0 lg [x] 1 +
L3 03 С/П
12 секунд. 5 команд. Не использует дополнительные регистры и переходы. Есть разница?
Прошу прощения, проебал при записи команду БП 03 в первом случае:
П0 Сx П4
ИП0 1 0 - /-/ x<0 19
ИП0 1 0 / [x] П0 КИП4 БП 03
ИП4 С/П
Без С/П получается:
1) 20 команд, 40 секунд;
2) 13 команд, 31 секунда;
3) 5 команд, 12 секунд.
Это не симулятор, это именно эмулятор (ссылка в первом сообщении, можешь посмотреть код). Некорректно будет лишь сравнивать его скорость с чем-нибудь, но тактовая частота калькулятора известна, так что можно посчитать.
Чё ты пиздишь? По тем временам очень хорошая точность. Тригонометрия и логарифмы считались в пределах долей секунды, так что и скорость приемлемая (ну да, не космическая, конечно, но для калькулятора той поры - норма).
Примеры точности:
lg 321 = 2,5065050324...
МК-61: 2,5065050.
lg 456 = 2,6589648426...
МК-61: 2,6589648.
ln 33 = 3,4965075614...
МК-61: 3,4965076.
sin 60º = 0,8660254037...
МК-61: 0,86602544.
tg 30º = 0,5773502691...
МК-61: 0,57735027.
Ну а, например, последовательность "3 lg 10^x" даёт все(!) знаки неправильно, при этом погрешность составляет 0,0000006.
Для случая с синусом:
0,84147103 - 0,8414709848 = 0,0000000451.
Здесь ты прав. Но в любом случае аппаратное решение быстрее.
Можно попробовать сделать на логарифме по основанию два, тогда деление будет просто >> 1, а потом переводить в десятичный делением на известную lg 2. Ясно, что будет НЕТОЧНО, но было бы прикольно, если бы кто написал.
Да ладно. Специально померял: самый быстрый вариант - if. Медленнее его в полтора раза - цикл с умножением. В 4.5 раза медленнее цикл с делением , в котором gcc хоть и заменил div на mul, но lea в цикле с умножением все равно быстрее (если бы деление не соптимизировалось, было бы еще медленнее). log10, написанный без "лишних" проверок на асме (FPU, не SSE) в 9 раз медленнее if. И, наконец, библиотечный log10 медленнее if в 15 раз.
А чем не четвёртый вариант?
битов = 0;
ПОКА число > 0 ВЫП
СдвигП(число, 1);
УВЕЛИЧИТЬ(битов)
КОН;
длина = ЦЕЛЧАСТЬ(битов / log2(10)) + 1;
Пок_пок_пок_кудах()
Подумаешь, погрешность в один знак. Одним знаком больше, одним меньше... Быдлокодерам простительно.
Так сразу очевидно, что вариант на переходах самый быстрый, только какой вменяемый человек его будет применять? На калькуляторе это просто нереально, хуй с ним, но, блядь, для 64-разрядного числа надо будет 20 проверок.
Очевидно, что вменяемый человек сделает цепочку ?: для 32 бит или цикл сравнений по табличке для 64 бит и выше.
длина = число < 10 ? 1 : число < 100 ? 2 : число < 1000 ? 3 : число < 10000 ? 4 : число < 100000 ? 5 : число < 1000000 ? 6 : число < 10000000 ? 7 : число < 100000000 ? 8 : число < 1000000000 ? 9 : 10;
Просто охуенно.
есть идея запилить один сервис с бекендом из нескольких калькуляторов
Хуй его знает, как ты считал. При вычислении логарифма при компиляции у меня сводится к ln(2) * log2(x) / ln(10) , где натуральные логарифмы - постоянные (константы). Если руки не из плеч растут, то пиши хоть на сосемблере, хоть на залупе мелом, будет хуёво работать.
Это как?
Т. е. всё сводится к тому, чтобы взять двоичный логарифм и умножить его на 0,30103. Неужели это медленное ебучих циклов?
У меня при компиляции вариант на асме сводится к считанным инструкциям: загрузка числа, fldlg2 (загрузка константы log10(2)), fyl2x (log2(число) * log10(2)), выгрузка числа. Можешь придумать быстрее?
> взять двоичный логарифм и умножить его на 0,30103
> Неужели это медленное ебучих циклов?
Если честно на FPU считать - медленнее. Если по табличкам с хуевой точностью... ну хуй знает, будет побыстрее, но цикла по табличке типа 9, 99, 999... будет еще быстрее.
Если ряд логарифма обрубить в положенном месте получится что-то похожее по производительности
Задача: наговнокодить/спиздить программку "8 ферзей", которая вычисляет такие восемь координат на шахматной доске, что ферзи, расставленные на них, не будут находиться под ударом друг друга. Писать можно хоть в битах, хоть хуем по воде, важен результат.
Критерии:
1) объём программы (байты);
2) объёб использованной памяти (байты);
3) количество исполненных инструкций (время * тактовая частота).
Итак, первый пошёл. МК-61.
Сx П0 П1 П2 П3 П4 П5 П6 П7 П8
ПB ПC 8 ПA ИПC 1 + ПC ИПA KПC
ИПB 1 + ПB ИПC ПD ИПD 1 - x#0
64 x>=0 64 ПD KИПC KИПD - П9 x#0 47
|x| ИПC ИПD - - x=0 26 0 ПB KИПC
1 - KПC x=0 26 ИПC 1 - ПC KИПC
1 - БП 52 ИПB 1 - x=0 20 ИПC
ИПA - x=0 14 С/П
1) 74 команды = 74 байта.
2) 14 регистров + 4 регистра стёка = 12 слов (14 + 4) = 108 байтов.
3) 39285 с 4 ком/с = 157140 инструкций.
Полученное решение на картинке.
Итак, второй пошёл. C.
#include <stdio.h>
main:
puts("8 &.......\n7 ......&.\n6 ....&...\n5 .......&\n4 .&......\n3 ...&....\n2 .....&..\n1 ..&.....\n abcdefgh");
Считай.
Нахуя? Стандартная доска, 8 ферзёв - самое то.
Решение чего? В задании чётко написано: "вычислить". Не написано "вывести решение", "нарисовать доску", "пососать хуй" или что-нибудь ещё. Впрочем, последнее задание тебе всё ж стоит решить.
>В задании чётко написано: "вычислить"
Я и вычислил. Ты вообще счастлив должен быть, что бог кодинга удостоил тебя своим вниманием; снизошёл с вершин своего величия и окропил плебс своим гениальным кодом.
>или что-нибудь ещё
>последнее задание тебе всё ж стоит решить
Наверное, ты прав. Пойду займусь - не всё же мне освещать этот убогий раздел своим величественным присутствием, надо и дела делать.
> наговнокодить/спиздить программку "8 ферзей", которая вычисляет
> Я и вычислил.
Ну давай тогда параметры своего быдлокодерского мозжечка, сравним.
> В задании чётко написано: ... "пососать хуй" ... последнее задание тебе всё ж стоит решить.
> Наверное, ты прав. Пойду займусь
Вперёд и с песней.
О! Ты не только обосрался, но и сделал вид, что не пахнет, и продолжил обсираться. Меньшего и не ожидалось от сосачера.
Вот это мужик! Ему щеку порезали, а он стоит серьёзный, как ни в чём не бывало.
Невдомёк убогой пародии на человека, что мало иметь петушиный диплом бакалавра или надрочить пару страниц кода на школьной олимпиаде, чтобы стать программистом. В итоге сей нелепый выкидыш эволюции постепенно начинает осознавать, что мир далеко не такой, каким он его представлял.
Начинается осознание своей неполноценности, бесполезности существования, принципиальной невозможности удовлетворения идиотских амбиций. Но выбор есть всегда. Если довлеет первый вариант, то он будет напирать на саморазвитие, освоение действительно достойных технологий, на которых зиждутся основы и производится лучшее. И понимает, что здесь он нахуй никому не нужен такой умный. Тогда остаётся лишь второй вариант: нырнуть в общий поток канализации, ухватиться за проплывающий кусок дерьма и питаться с него всю свою никчёмную жизнь. Кого-то это устраивает, как многих устраивает и профессия проститутки, уборщика параши, официанта в Макдаке и т. п. Но у более или менее нормального человека начинается ломка системы ценностей, мировоззрения, возникают мысли о бессмысленно прожитой жизни и безысходности, обостряются старые комплексы, перерастая в глубокий психологический кризис...
Да, когда-то "программист" был серьёзной инженерной профессией с оттенком элитарности. В те годы от программиста требовалось действительно мастерское овладение соответствующими технологиями, а это давалось далеко не каждому. Сейчас же любой даун-аутист может себя назвать программистом, потому что освоил азы быдлокодинга и работает за еду. А реальные профессионалы, как и во многих других смежных областях, сегодня практически не востребованы. Так что выбор невелик: кукарекать у параши за банку сгущёнки или молча догнивать в осознании своей полной несостоятельности и бессмысленности существования.
Невдомёк убогой пародии на человека, что мало иметь петушиный диплом бакалавра или надрочить пару страниц кода на школьной олимпиаде, чтобы стать программистом. В итоге сей нелепый выкидыш эволюции постепенно начинает осознавать, что мир далеко не такой, каким он его представлял.
Начинается осознание своей неполноценности, бесполезности существования, принципиальной невозможности удовлетворения идиотских амбиций. Но выбор есть всегда. Если довлеет первый вариант, то он будет напирать на саморазвитие, освоение действительно достойных технологий, на которых зиждутся основы и производится лучшее. И понимает, что здесь он нахуй никому не нужен такой умный. Тогда остаётся лишь второй вариант: нырнуть в общий поток канализации, ухватиться за проплывающий кусок дерьма и питаться с него всю свою никчёмную жизнь. Кого-то это устраивает, как многих устраивает и профессия проститутки, уборщика параши, официанта в Макдаке и т. п. Но у более или менее нормального человека начинается ломка системы ценностей, мировоззрения, возникают мысли о бессмысленно прожитой жизни и безысходности, обостряются старые комплексы, перерастая в глубокий психологический кризис...
Да, когда-то "программист" был серьёзной инженерной профессией с оттенком элитарности. В те годы от программиста требовалось действительно мастерское овладение соответствующими технологиями, а это давалось далеко не каждому. Сейчас же любой даун-аутист может себя назвать программистом, потому что освоил азы быдлокодинга и работает за еду. А реальные профессионалы, как и во многих других смежных областях, сегодня практически не востребованы. Так что выбор невелик: кукарекать у параши за банку сгущёнки или молча догнивать в осознании своей полной несостоятельности и бессмысленности существования.
> там его, видимо, опустили
Нет. Там он был стукачом-осведомителем (козлом). Оперативный псевдоним Ветров. В "Архипелаге" кстати это упоминается.
Что «вы», кто вы-то, ёпта, кто «вы»? Здесь мы вдвоём, блядь, я один и ты, ёпта. Какие, нахуй, шашки, чё ты несёшь, ёпта?! На чём ты в шашки собрался играть? Нахуя ты отжимаешься, блядь? Ты понимаешь, что ты поехавший уже, всё? Не я, блядь, поехавший, не он, блядь, а ты!
Ничего не понимаю... И это программисты? Говно какое-то... Пидоры, блядь. Родина им дала МК-61! Пиши, пиши под МК-61, блядь, не хочу, хочу жрать говно!
Бог дал человечеству Си. У меня один только вопрос: НАХУЯ ВОТ ЭТО ЧЕЛОВЕЧЕСТВУ??? За что мы должны ВОТ ЭТО любить?
> ИП9 lg [x] 1 +
Ну и не правильно.
ИП9 - вообще не нужно. (выдаёт кстати тот самый стиль. Кукарекающий).
Во-вторых чревато EГГОГ .
Кому-то захочется 0 исключить, но оснований к этому нет.
Ещё отрицательные числа интересно... :-)
Кстати, FPU тоже не у всех.
В общем, вариант такой:
unsigned mylog(unsigned x) {
unsigned n=10, r=1;
for(;;) { if(x<n) return r; ++r; if(n > UINT_MAX/10) return r; n = 10; }
}
/ Да, это не логарифм и не его целая часть /
/ Оптимизатор может быть преобразует в сравнения, как в первом варианте. */
Вот кстати. Однажды обнаружилось, что инноваторы разработали очередную инновацию. Со строками. И это оказалось в инноваионной замене... Логера. Ага. Логи оно вело и в самом деле инновационно. :-)
ИП9 - это просто цитата из программы http://rosettacode.org/wiki/Execute_a_Markov_algorithm#.D0.9C.D0.9A-61.2F52 , там ещё команда подъёма в стеке была, доска сожрала значок. Так-то понятно, что обычно поступающее в программу значение будет в регистре X, а не хуй знает где.
Про ЕГГОГ - ну изначально речь шла про натуральные числа (1, 2, 3...). Если нужно подставить любое число, то алгоритм немного усложнится, но всё равно обойдётся без всяких циклов с проверками внутри.
Нихуя себе оптимизатор. Прям мысли читает.
Тем не менее, такой вариант для МК-61 крайне расточителен (и медленнее, соответственно), и без знания элементарной математики быдлан-кодер соснул бы хуйцов, даже если бы освоил азы искусства составления программ для сего калькулятора.
При чём тут Си?
Лекция №1. Общее знакомство
Впервые добравшись до калькулятора МК-61, человек, знакомый с традиционными арифметическими и инженерными калькуляторами, обычно задаётся вопросом: где здесь кнопка "="? То же касается и дебила, который тоже в школе обычно вынужден поверхностно ознакомиться с калькулятором. Но последний, попытавшись сложить два числа и получив после нажатия кнопки "+" ноль, придёт к выводу о дефектности калькулятора, хотя таковая относится лишь к его мозгу. Потому попробуем помочь дебилам найти кнопку "=".
Итак, для начала калькулятор нужно включить. В верхней его части находится индикатор. На нём отображается число, с которым в данный момент работает калькулятор. Он также работает и с другими числами, расположенными в ячейках памяти, называемых регистрами, но обычно результат вводится и выводится на индикатор, значение которого также находится в регистре, обозначаемом X.
Слева под индикатором находится переключатель, подписанный справа "Вкл". С его помощью и включается калькулятор. На индикаторе загорится "0". Число вводится при помощи кнопок, на которые нанесены цифры. Можно также ввести дробное число посредством кнопки десятичной запятой (справа от кнопки "0"), поменять его знак ("/-/") и ввести порядок ("ВП"). Например, нужно ввести число -0,00000123. Для этого последовательно нажимаем: [1] [2] [3] /-/ ВП [8] /-/.
"А как же нам, например, сложить два числа?" - спросят дебилы. Чтобы понять это, необходимо ознакомиться с таким понятием, как стек. Стек нашего калькулятора - это просто четыре регистра, связанные между собой порядком помещения и извлечения из них чисел. Он подобен стопке, колоде карт: верхняя карта (в нашем случае число) лежит в регистре X и отображается на индикаторе. Когда мы кладём число в эту стопку, остальные числа оказываются глубже (под ним), а оно перед нами, на индикаторе.
В нашем распоряжении находятся четыре регистра стека (и один дополнительный, в него помещается результат предыдущей операции), обозначаемые буквами X, Y, Z, T (и X1). Мы можем производить с ним определённые операции. Вводимое с клавиатуры число оказывается в регистре X. Его можно поднять (скопировать) в следующий за ним регистр Y, при этом содержимое Y переместится в Z, содержимое Z - в T (предыдущее значение T сотрётся). Стек можно вращать, при этом X перемещается в T, T - в Z и т. д. Подъём или спуск значений происходит и при выполнении некоторых действий.
Зачем же нужен этот стек? Дело в том, что калькулятор принимает выражения в бесскобочной постфиксной нотации, т. е. не в традиционной форме "a + b =", а в форме "a b +", т. е. сначала вводятся числа, после производится операция. А вводятся числа как раз в этот самый стек. Как это делается? Введя число в регистр X, его нужно поднять в Y. Для этого используется кнопка [В↑]. После этого можно начинать вводить следующее число, предыдущее значение X при этом сотрётся.
Операции над числами делятся на одноместные (над одним числом, например сложение, вычитание, возведение в степень и т. д.) и двухместные (корень, тригонометрия, логарифмы и т. д.). Двухместные операции производятся над регистрами X и Y.
Для примера сложим два числа: [1] [В↑] [2] +. Здесь в X вводится число 1, поднимается в Y, в X вводится число 2, после чего Y и X складываются, результат на индикаторе (в X). При этом значения стека спускаются (T обнуляется, предыдущее значение T перемещается в Z, Z - в Y, в X1 - предыдущее значение X, т. е. 2). В случае с вычитанием выполняется операция Y - X (аналогично с делением).
"А как же нам, например, сложить два числа?" - спросят дебилы. Чтобы понять это, необходимо ознакомиться с таким понятием, как стек. Стек нашего калькулятора - это просто четыре регистра, связанные между собой порядком помещения и извлечения из них чисел. Он подобен стопке, колоде карт: верхняя карта (в нашем случае число) лежит в регистре X и отображается на индикаторе. Когда мы кладём число в эту стопку, остальные числа оказываются глубже (под ним), а оно перед нами, на индикаторе.
В нашем распоряжении находятся четыре регистра стека (и один дополнительный, в него помещается результат предыдущей операции), обозначаемые буквами X, Y, Z, T (и X1). Мы можем производить с ним определённые операции. Вводимое с клавиатуры число оказывается в регистре X. Его можно поднять (скопировать) в следующий за ним регистр Y, при этом содержимое Y переместится в Z, содержимое Z - в T (предыдущее значение T сотрётся). Стек можно вращать, при этом X перемещается в T, T - в Z и т. д. Подъём или спуск значений происходит и при выполнении некоторых действий.
Зачем же нужен этот стек? Дело в том, что калькулятор принимает выражения в бесскобочной постфиксной нотации, т. е. не в традиционной форме "a + b =", а в форме "a b +", т. е. сначала вводятся числа, после производится операция. А вводятся числа как раз в этот самый стек. Как это делается? Введя число в регистр X, его нужно поднять в Y. Для этого используется кнопка [В↑]. После этого можно начинать вводить следующее число, предыдущее значение X при этом сотрётся.
Операции над числами делятся на одноместные (над одним числом, например сложение, вычитание, возведение в степень и т. д.) и двухместные (корень, тригонометрия, логарифмы и т. д.). Двухместные операции производятся над регистрами X и Y.
Для примера сложим два числа: [1] [В↑] [2] +. Здесь в X вводится число 1, поднимается в Y, в X вводится число 2, после чего Y и X складываются, результат на индикаторе (в X). При этом значения стека спускаются (T обнуляется, предыдущее значение T перемещается в Z, Z - в Y, в X1 - предыдущее значение X, т. е. 2). В случае с вычитанием выполняется операция Y - X (аналогично с делением).
Лекция №3. Работа с памятью
В качестве основной памяти в МК-61 используется 15 регистров общего назначения. Они обозначаются цифрами от 0 до 9 и буквами от A до E (10 - 15). Для помещения числа в один из регистров используется кнопка "X→П", после нажатия которой нужно нажать соответствующую номеру регистра кнопку на цифровой клавиатуре или кнопку, подписанную нужной буквой снизу/справа от неё. Аналогичным образом число извлекается из регистра посредством кнопки "П→X".
При работе на калькуляторе для хранения промежуточных данных зачастую используется стек. При этом необходимо следить, чтобы сохранённое значение не было стёрто в процессе вычислений.
В МК-61 существует также косвенная адресация регистров. Так, например, если поместить в регистр №7 число 8, то при помощи последовательного нажатия [K] [П→X] [7] на индикаторе появится содержимое регистра №8. Здесь необходимо отметить, что при косвенном обращении через регистры 0 - 3 их значение предварительно уменьшается на единицу, а через 4 - 6 - увеличивается. Т. е. если в Р4 было 5, то [K] [П→X] [4] выдаст число из Р6.
Польской? В Курвляндии, что ли, говорят, типа "курвы хуи жопы подставляют сосут"?
Но пытливый ум дебила непременно задастся вопросом: "Что за хуйня? Калькулятор ведь программируемый. Где программы?". Потому покажем, как же всё-таки вводятся и исполняются программы на МК-61.
Для запуска режима ввода программы необходимо нажать последовательность кнопок [F] ВП ("ПРГ"). Далее вводится программа, аналогично тому, как производятся вычисления в ручном режиме. В правой части индикатора отображается счётчик команд, текущее его значение показывает адрес, по которому будет размещена вводимая инструкция (шаг программы). Максимальная длина программы - 105 шагов. При вводе программы на индикаторе отображаются три последних (предшествующих указываемому адресу) кода инструкции.
Напишем для примера программу, которая умножит вводимое число на 3, прибавит к нему 4 и возведёт полученное значение в квадрат. Для этого последовательно нажимаем: [В↑] [3] × [4] + [F] × [С/П]. В результате в программной памяти окажется программа: ↑ 3 × 4 + x^2 С/П. При оформлении кода программы в текстовом виде указывается не непосредственно клавиша, которую необходимо нажать, а инструкция, которая будет выполнена: в нашем случае - не "F ×", а "x^2". Команда "С/П" (стоп/пуск) останавливает выполнение программы.
Теперь выходим из режима программирования нажатием [F] /-/ ("АВТ"). Для запуска программы обнуляем счётчик шагов кнопкой "В/О" (возврат/очистка), вводим начальные данные, например, 5. Запускаем программу - "С/П". После выполнения на индикаторе 361.
Можно сказать, МК-61 не так давно пережил второе рождение. Заключается оно в довольно неожиданном подъёме интереса к этой машинке спустя 20 лет. Началось всё с первого качественного симулятора:
http://www.emulator3000.org/rus-c3.htm
Но истинные ценители понимали, что это хуйня, нужен эмулятор. Тут и начались работы по восстановлению микрокода калькулятора. В 2012 году эта работа была завершена и написан первый эмулятор (впоследствии реализован и в упомянутой программе-симуляторе):
http://code.google.com/p/emu145/ (обсуждение: www.leningrad.su/calc/cforum.php?topicid=571 )
С тех пор написано ещё несколько качественных эмуляторов:
https://code.google.com/p/mk52/
https://play.google.com/store/apps/details?id=com.cax.pmk (под Андроид)
http://mk-61.moy.su/ (обсуждение: http://arbinada.com/pmk/node/963 )
Эмуляторы дополнены различными вспомогательными средствами, упрощающими работу с калькулятором и понимание принципов его действия.
Пишутся новые статьи и программы, изучается накопленный за прежние годы материал (а это десятки книг и сотни статей). Что интересно, интерес к калькулятору проявляется не только в нашей стране, например:
http://www.alfredklomp.com/technology/mk-61/ (статья про эксперименты с недокументированными возможностями)
http://gtello.pagesperso-orange.fr/elektronika_e.htm (компилятор высокоуровневого языка под МК-61, описание, тесты скорости)
Составляются сборники старых игр:
http://lordbss.narod.ru/pmk.html
Разнообразные программы:
http://rosettacode.org/wiki/%D0%9C%D0%9A-61/52
Переводится документация, составляются инструкции и многое другое.
Быдлокодинг и самокритика - понятия несовместимые.
зимой могут дают поспать возле тёплого канализационного люка
Смотря кем работает.
накатим!
Ещё скажи, что ты больше зарабатываешь, быдлан. Водка, вроде как, подорожала в Пидарашке, так что тебе и на дрожжи для самогона придётся бутылки собирать, потому что вряд ли за твой говнокод платят больше, чем ты заработаешь подобным образом.
> Ещё скажи, что ты больше зарабатываешь,
да
> дрожжи для самогона
ниразу небыл в росии, поэтому не в курсе
> Пидарашке
разве не об этом тред?
Так а я о чём? Не из России (России, не пидаРФашки) по-русски кудахтают только беглые припадочные обиженники по жизни, у которых между приступами ностальгии и русофобии случается когнитивный диссонанс, ведущий в конечном итоге к таким психическим расстройствам, как педерастия, копрофагия, некро- и зоофилия, склонность к инцесту и т. п. Что мы и видим на твоём примере.
Вот поясните про современные процессоры, вот всяким ARM и x86 понимают разницу между операторами и операндами? Помню на первом курсе поясняли что есть Code Segment, Data Segment, и по идее процессор не должен исполнять код который находится в сегменте данных. Но как тогда до сих пор можно эксплуатировать Buffer Overflow атаки? Ведь мы можем на стеке расположить свой код который мы можем исполнить подменив return адрес на том же стеке?
Код на стеке распологать не обязательно, ты его можешь расположить где угодно, а потом просто подменить код возрата на адрес твоего зловредного кода. Если в програме есть ошибки которые позволяют переполнить буфер то подменить коды возврата не так-то и сложно, из-за того как современные языки работают с call stack (там располагают аргументы функций и автоматические переменные в перемешку с кодами возврата). Против такой атаки деление памяти на только читаемую и только выполняемую никак не помогает, так как зловредный код расположен как библиотека в исполняемой памяти, а подменяется только код возврата. Конкретно процессор никак не следит что он выполняет, естественно если у него не отдельная память под код (гарвардская архитектура). За этим следит ОС, напрмиер страницы памяти разделяются только на записываемые или только исполняемые - но это далеко не от всего помогает.
Благодарю. Тогда в чём смысл всех этих разделений на CS, DS, SS. Если любой из них можно читать как инструкции? Условности?
На любой сегмент можно повесить ограничения на уровне менеджера страниц в процессоре. GDT там и все такое. Более того, в интелах(и amd) всегда было не два режима - ядро и юзерланд, а четыре. Другое дело, что самый популярный софт - читай, винда с линуксами, это использовать не умели.
> на первом курсе поясняли
> Code Segment
> Data Segment
> Buffer Overflow атаки
> return адрес
2-й курс бакалавра подзалупоочного отделения кафедры петушиных наук, что ли?
Так это просто вопрос о правильности вполне логичного вывода. Негодование тут совсем не обязательно, может, наоборот - веселье по поводу столь неординарного случая.
Ну про всякие буфер оверфлоу атаки я с корсерки узнал, там курс Hardware Software Interface, лабы в нём с дебаггером, ну там хекать надо подобия крякми, всё такое.
Господин балаклавр, до Вас доебались лишь по одной причине: использование импортной терминологии на иностранном языке, которое свидетельствует о полном невладении собственно терминологией и, как следствие, предметом. Не более того, уважаемые знатоки. При всём уважении, данный уровень неприемлем для нашей весёлой ветки калькуляторщиков для масти выше петуха.
Не, серьёзно, не надо "кукареку", ты объясни, где тут пидарашку ты узрел?
Местные петухи не способны это понять. Дело тут не в возрасте даже. Многие и в те годы не имели на руках МК-61. Дело в ненависти к тому, что не поддаётся их познанию, что как-нибудь связано с русской нацией и не вписывается в основной поток канализации, по которому местная быдлятина плывёт.
Хотя и тут встаёт вопрос: хоть кто-то прочитал и понял целиком книгу деда Трохименка "Устройство и пользование..."? Я, к примеру, так до конца и не осилил: тут надо чуть ли не с микроскопом и тысячестраничным конспектом напротив калькулятора с книгой сидеть, чтобы вникнуть, а потом свой конспект раскладывать на тома и писать к ним конспекты, пояснения, схемы, коды, инструкции и т. д.
Это копия, сохраненная 15 июня 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.