По-рано тази година споделихме историята за това как играч на класическия Tetris на NES е достигнал невиждано ниво на играта за първи път, активирайки срив след невероятно 40-минутно изпълнение с 1511 линии. Сега някои играчи използват този екран - и някои сложни манипулации с паметта, които той позволява, - за да кодират нови поведения във версиите на Tetris, работещи на немодифициран хардуер и касетки.
Основният метод за въвеждане на външен код в NES Tetris е публично известен поне от 2021 г., когато играчите изследват декомпилирания код на играта. Но неотдавнашен видеоклип на Displaced Gamers пренася идеята от частна теория към публично изпълнение, като подробно обяснява как да накараме NES порта на Tetris да започне да чете таблиците с високи резултати в играта като инструкции от машинен код.
Модифицирането на копие на NES Tetris е възможно най-вече поради специфичния начин, по който играта се срива. Без да навлизаме в подробности, сривът в NES версията на Tetris се случва, когато обработката на резултатите в играта отнема твърде много време, за да изчисли нов резултат между кадрите, което може да се случи след ниво 155. Когато се получи това забавяне, част от контролния код се прекъсва от рутинната програма за записване на нов кадър, което я кара да прескочи в непредвидена част от оперативната памет на играта, за да търси следващата инструкция.
Обикновено това неочаквано прекъсване кара кода да прескочи до адрес в самото начало на RAM паметта, където отпадъчните данни се прочитат като код и често водят до бърз срив. Но играчите могат да манипулират този скок благодарение на малко известна странност в начина, по който Tetris обработва потенциалните входове, когато работи на японската версия на конзолата Famicom.
За разлика от американската Nintendo Entertainment System японският Famicom разполага с два контролера, свързани с устройството. Играчите, които искат да използват контролери на други производители, могат да ги включат чрез разширителен порт в предната част на системата. Кодът на играта Tetris чете входните данни от този „допълнителен“ порт за контролери, който може да включва два допълнителни стандартни NES контролера чрез използване на адаптер (това е вярно, въпреки че Famicom получи напълно различна версия на Tetris от Bullet-Proof Software).
Така се случва, че областта от RAM паметта, която Tetris използва за обработката на този допълнителен вход за контролера, се използва и за местоположението на паметта на тази процедура за скок, която обсъдихме по-рано. По този начин, когато тази процедура за скок бъде прекъсната от срив, тази оперативна памет ще съдържа данни, представляващи натиснатите бутони на тези контролери. Това дава на играчите потенциален начин да контролират къде точно отива кодът на играта след задействането на срива.
За метода на Displaced Gamers за контрол на скоковете играчът трябва да задържи „нагоре“ на третия контролер и надясно, наляво и надолу на четвъртия контролер (тази последна комбинация изисква известно преместване на контролера, за да се осигури едновременното въвеждане на лява и дясна посока). По този начин кодът за скок се изпраща в област от оперативната памет, в която се съхраняват имената и резултатите за списъка с високи резултати в играта, което дава още по-голяма площ от оперативната памет, която може да бъде манипулирана директно от играча.
Като поставим G в целевата част на таблицата с високи резултати на B-Type, можем да накараме играта да прескочи в друга област на таблицата с високи резултати, където ще започне да чете имената и резултатите последователно като това, което Displaced Gamers нарича bare metal код, като буквите и цифрите представляват операционни кодове за процесора на NES.
За съжаление има само 43 възможни символа, които могат да се използват в областта за въвеждане на име, и 10 различни цифри, които могат да бъдат част от висок резултат. Това означава, че само малка част от наличните опкод инструкции на NES могат да бъдат „закодирани“ в таблицата за висок резултат, като се използва наличната повърхност за атака.
Въпреки тези ограничения Displaced Gamers успя да кодира кратък фрагмент от код за доказателство на концепцията, който може да бъде преведен в данни от таблицата за високи резултати. (Име на „))“-P)“ и резултат от 8575 точки на второ място в играта A-Type фактори на видно място, в случай че се чудите.) Тази проста процедура поставя две нули в най-горните цифри на резултата от играта, намалявайки времето за обработка на резултата, което в противен случай би довело до срив (въпреки че резултатът в крайна сметка отново ще достигне „опасната зона“ за срив при продължаване на играта).
Разбира се, липсата на система за запаметяване, поддържана от батерията, означава, че хакерите трябва да постигат тези високи резултати ръчно (и да въвеждат тези сложни имена) всеки път, когато включват Tetris на базова NES.
Снимка: Unsplash/Displaced Gamers