LINUX.ORG.RU
ФорумTalks

Тетрис отреверсили

 , ,


0

3

https://habr.com/ru/articles/1071018/
https://github.com/n0isy/original-tetris-recomp

Реконструировали исходники самого первого Тетриса. На паскале. Собирается в эмуляторе VAX в программу до бита совпадающую с оригиналом.

Довольно интересно задаются фигуры. Вместо готовой таблицы констант, каждый раз генерируются, что увеличивает программу на 13%. По мнению автора статьи — так было легче отлаживать. (А по-моему, это может быть связано с тем, что изначально хотели сделать пентамино.)

★★★★★

я, когда кодерил свой тетрис на турбо-паскале - так вообще без ООП не смог обойтись. Полноценного, с базовым классом и наследованием. Зато я теперь точно знаю, что чтобы добавить новую фигуру, мне нужно просто создать ещё один класс-наследник.

И даже применения принципа инверсии контроля не нужно было в моём коде.

seiken ★★★★★
()
Ответ на: комментарий от question4

Да без разницы, когда. Я к тому, что нет никакой её связи с постом.

dataman ★★★★★
()
Ответ на: комментарий от seiken

я, когда кодерил свой тетрис на турбо-паскале - так вообще без ООП не смог обойтись. Полноценного, с базовым классом и наследованием.

Ощущать необходимость ООП для тетриса это как иметь иметь больничное отделение с реанимацией просто для того, чтобы просыпаться по утрам.

Bfgeshka ★★★★★
()
Ответ на: комментарий от Bfgeshka

Есть же хорошая история про «кенгуру перегруппировались, появились из-за холма и сбили вертолёты стингерами».

imul ★★★★★
()
Ответ на: комментарий от Bfgeshka

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

Кстати, в порно-тетрисе нужно использовать своего рода донорно-акцепторный паттерн. Т.е. как бы у каждого объекта есть атрибут, и он неинвариантен повороту. Надо будет перечитать классиков ООП на тему подходящего ООП-паттерна в данном случае…

seiken ★★★★★
()
Ответ на: комментарий от seiken

Вот в этом-то сам и фикус. Наследования. Причём, к сожалению.

cadaber ★★
()

это в этой версии пажитнов вместо того чтобы проиницилизировать исходный массив из возможных стартовых позиций, каждый раз пересчитывает их заново ?

kto_tama ★★★★★
()
Ответ на: комментарий от kto_tama

Зачем? Если из 4 вариантов можно выбрать любую. Я так «крестики-нолики» однажды написал. Причём, без всякого ИИ. Просто, прога запоминала предыдущие матчи и ходила соответственно. Реально, выиграть после пары раундов было невозможно.

Это я к чему, собственно? Я не знаю, как Пажитнов оформлял каждый кубик. Во-всяком случае, ООП - в среде Турбо Паскаля было что-то далёкое, поскольку 5.0 - был тупой в доску.

cadaber ★★
()

Всего 590 строк на Паскале? Кажется это самые запускаемые когда-либо строки кода по соотношению число проведённых часов в них людьми делённое на число строк.

unDEFER ★★★★★
()
Ответ на: комментарий от unDEFER

Всего 590 строк на Паскале? Кажется это самые запускаемые когда-либо строки кода по соотношению число проведённых часов в них людьми делённое на число строк.

Очень сомневаюсь.

Думаю, ошибка в том, что ты посчитал всё время, которое люди провели в «тетрисе». При том, что 99%+ этого времени никак не использовало эти строки на паскале, а было отдельной реализацией: для консолей, для популярных в 80-90-х портативных «тетрисов» на батарейках, да даже для других компов впоследствии — нигде там этот самый изначальный вариант на паскале не запускался.

CrX ★★★★★
()
Ответ на: комментарий от unDEFER

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

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

Ну то есть, даже например у версии Tetris’а для NES/Famicom и то явно больше будет. Или для GameBoy, с которым он в комплекте даже шёл…

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 4)
Ответ на: комментарий от CrX

у которых есть соответствующий комп

На вот этом работало: https://www.chipmaker.ru/uploads/post/monthly_2022_01/20220117_143959.jpg.c75...

Не знаю, кто, но классический набор символьных аркад под PDP-11 клоны - tetris, snake и xonix - на них очень быстро портировали - под уменьшенный экран. Соответственно, куча работяг ещё могли вместо перекура балду пинать (при наличии нужных перфолент)

Shadow ★★★★★
()
Последнее исправление: Shadow (всего исправлений: 2)
Ответ на: комментарий от Shadow

Да, но «куча работяг» тогда — это не «куча работяг» сегодня. Это тысячи, может десятки тысяч людей. Не миллионы.

CrX ★★★★★
()
Ответ на: комментарий от unDEFER

И сколько же часов выполнялся command.com?

По-моему, всё время, до выключения компа.

Это же из DOS?

Конечно. Или её клонов.

dataman ★★★★★
()
Ответ на: комментарий от dataman

Хм, даже не знал, что .com - это исполняемые файлы. Думал, что скрипты.

unDEFER ★★★★★
()
Ответ на: комментарий от dataman

По-моему, всё время, до выключения компа.

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

r--r--r--
()
Последнее исправление: r--r--r-- (всего исправлений: 1)
Ответ на: комментарий от r--r--r--

Ладно. В те времена у меня вместо mc были nc.com или vc.com. :)

dataman ★★★★★
()
Ответ на: комментарий от sabacs

Нет. В памяти оставался резидентый кусок кода, котому дос возвращал управление по (корректному) выходу ранее загруженного exe. DOS работает в 16 бит, память общая. Векторы прерывания, BIOS, резидентные программы, включая кусок command.com - всё это висит в общей памяти с исполняемой программой.

r--r--r--
()
Ответ на: комментарий от sabacs

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

Какая запятая читается плохо?

r--r--r--
()

Значимость игры Тетрис переоценена. Нинтендо или кто там купил на неё права, искусала все локти.

lenin386 ★★★★★
()
Ответ на: комментарий от r--r--r--

Ну т.е. и трусы и крестик одновременно? Однако…! %)

sabacs
()
Ответ на: комментарий от sabacs

Как-как, ёпта... Ну, если начать с самого начала... то BIOS (Basic Inpit/Output System), искал, на 1 разделе, 1-го подключенного дисковода, с 1 сектора сигнатуру. Если находил подходящую, то считывал её в оперативную память и передавал управление. А дальше уже -хоть с конями пляши, этим обычно занималась ОСь. В данном конкретном случае, загрузчик винды, ну или grub, кому как больше нравится, в 1 секторе 0-го цилиндра HD. Я почему эту кухню знаю - потому как сам, мультизагрузчик писал. Собственными шаловливыми ручками.

Короче, приплыл к нам некий русофицированный японец, который внезапно захотел, чтобы у него на ноуте, по нажатию кнопки, загружался либо Японский win-95, либо Русский. Кто в теме, те знают, что они довольно сильно отличались.

Ну так вот. Я сделал две винды, на двух разделах (иначе 95 не работает), с «переключением», а точнее - с перекидыванием разделов MBR, меняя их местами, при загрузке. причём блять, весь код - умудрился впихнуть в те самые 512 байт 1-го сектора. Хотя, вру: часть 2-го сектора всё-таки пришлось захватить, но исключительно для сообщения, при перехвате прерывания 09h, дескать, нажмите клавишу 1 или 2, для загрузки...

Ух, ёлы! Это внатуре весело было! Только сейчас, по прошествии многия лет это вспоминая...

cadaber ★★
()
Ответ на: комментарий от sabacs

Притом, что command.com (64кб) загружался в оперативную память тоже, не просто так. А посредством того-же BIOS-загрузчика, который загружал в оперативную память сам загрузчик ОС, который, повторюсь, находился на 1 секторе 0-го цилиндра, тот в свою очередь искал загрузчик ОСи, находившийся далее в ФС, тот находил этот самый сраный command.com, загружал его в оперативку и передавал управление.

Вот как-то так...

Если точнее, не совсем так. Сначала он загружал в оперативку файлы io.sys и msdos.sys, а уж потом, command.com =)

cadaber ★★
()
Последнее исправление: cadaber (всего исправлений: 1)
Ответ на: комментарий от cadaber

В DOS была загрузка по цепочке. BIOS при включении компьютера сразу же получал управление, проводил POST, затем из загрузочного сектора считывал загрузчик, а тот считывал IO.SYS. Последний, уже имея возможность читать файлы, считывал MSDOS.SYS, тот, в свою очередь, обрабатывал CONFIG.SYS, загружал COMMAND.COM, который обрабатывал AUTOEXEC.BAT, выдавал приглашение командной строки и переходил в состояние TSR-программы.

yars068 ★★★★★
()
Последнее исправление: yars068 (всего исправлений: 2)
Ответ на: комментарий от yars068

Можно подумать, сейчас не так. Так-же, просто часть обязанносей взяло-взвалило на себя UEFI, а впринципе, одинаково.

cadaber ★★
()
Ответ на: комментарий от yars068

Про TSR кстати. Ох, любил я их писать... Причём, на Паскале. Ну там как - Borland Pascal 6 - позволял делать вставки на ассемблере. ТASM - не то..., там надо буфер делать 100 и ещё многие штуки... а тут просто даёшь дирекиву ASM - и извращайся как хочешь. Приятно.

Я так видеоадаптер, тогда ещё VGA переиначивал, чтобы не 320х200х256, а 320х240, чтобы пиксель квадратный был. Видеопамять конечно уменьшалась, зато был доступен аппаратный скроллинг, а не просто переключение страниц. Ну, кто в теме - тот понимает, о чём я... =)

Ну а TSR - ну такое тоже делал, не без этого. Вешал обычно на прерывание таймера. Так чисто, ради прикола. Вирусы натурально писать - в принципе не проблема было, только нафига, спрашивается? Для собственного ЧСВ или на заказ? Дык, ни того ни другого не было. Заказали бы, в бесхлебном студенчестве - я бы написал наверное, причём запросто. Тогда, в 1991-ом, закона за номером 273 УК-РФ ещё не существовало.

PS: Боже, как я безнадёжно стар... =)

cadaber ★★
()
Последнее исправление: cadaber (всего исправлений: 5)
Ответ на: комментарий от cadaber

как я безнадёжно стар

Да нет, вполне надёжно. :)

dataman ★★★★★
()
Ответ на: комментарий от PunkPerson

Там есть ассемблерные вставки.

Но зачем писать на низком уровне (даже таком красивом, как машкод PDP-11), если можно этого не делать? Разве что ради того, чтобы почувствовать себя «настоящим программистом» из «Истории Мэла», но это обычно быстро проходит.

alegz ★★★★★
()
Ответ на: комментарий от lenin386

Нинтендо ... искусала все локти.

Не, ну нормально, самый успешный производитель приставок и игр ДО СИХ ПОР.

Shadow ★★★★★
()
Ответ на: комментарий от r--r--r--

Чисто формально, основной код command.com не был в памяти и его инструкции не исполнялись.

Вот как раз резидентная часть – то, что постоянно исполнялось. А заодно io.sys и msdos.sys.

question4 ★★★★★
() автор топика
Ответ на: комментарий от alegz

Как я предполагаю, в PDP-11 вопрос стоял несколько иначе - зачем писать на C, если есть ТАКОЙ macro.

Shadow ★★★★★
()
Ответ на: комментарий от dataman

command.com

Если копнуть глубже, то будут 2 BIOS-а – AMI и AWARD, которые стоят на подавляющем большинстве машин, начиная с 386-х. Код составлен из модулей, но какой-то «клей» должен быть общим. Или этот код выполняется только при загрузке, а из 32-разрядного режима недоступен?

question4 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему: только для зарегистрированных, score>=50.