Как обычный геймпад мог привести к очистке карты памяти на PS1 — история бага в Crash Bandicoot

Аппаратная ошибка, которая чуть не стала фатальной для знаменитого платформера.

Программист оригинальной Crash Bandicoot от Naughty Dog Дейв Бэггетт в 2013 году опубликовал на Gamasutra текст про необычный баг, который приводил к полному удалению данных с карты памяти. Пожалуй, самое удивительное в этой истории, что ошибка была вызвана проблемами в железе. Пересказываем материал.

Как обычный геймпад мог привести к очистке карты памяти на PS1 — история бага в Crash Bandicoot

По словам Бэггетта, обычно при возникновении ошибки программисты в первую очередь винят свой код. Затем подозрения падают на компилятор. И уже в последнюю очередь — на железо. Как раз c аппаратной ошибкой Бэггетт и столкнулся, когда писал код для Crash Bandicoot.

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

Как обычный геймпад мог привести к очистке карты памяти на PS1 — история бага в Crash Bandicoot

Постепенно напряжение нарастало — продюсер Sony Конни Бут начала паниковать, так как это был серьёзный баг, из-за которого релиз игры могли отложить. Через Конни программисты из Naughty Dog связались с другими разработчиками, которые делали игры для PS1. Но ни у кого не возникало проблем с картой памяти.

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

Как обычный геймпад мог привести к очистке карты памяти на PS1 — история бага в Crash Bandicoot

В результате у Бэггетта остался лишь код запуска системы, но ошибка всё ещё повторялась. В определённый момент у программиста появилась догадка. Чтение и запись данных всегда опирается на время — часы позволяют аппаратному устройству, которое напрямую не подключено к процессору, оставаться синхронизированным с кодом, который исполняется CPU.

Часы связаны со скоростью передачи данных, поэтому если с ними что-то случится, то система просто запутается. Такие ситуации часто приводят к повреждению данных. Бэггетт проверил таймер на PS1 и заметил, что он установлен на 1 кГц — 1 тысячу тиков в секунду. Обычно игры на PS1 работали всего на 100 Гц, что значительно ниже, чем частота в Crash Bandicoot.

Как обычный геймпад мог привести к очистке карты памяти на PS1 — история бага в Crash Bandicoot

Оказалось, что другой программист завысил частоту, чтобы добиться более точных вычислений. Бэггетт снизил частоту до 100 Гц и по какой-то причине баг исчез. Разработчик решил проблему, но на тот момент всё ещё не разобрался, из-за чего она возникала.

После Бэггетт неоднократно возвращался к ошибке и пытался понять, почему частота в 1 кГц приводила к проблеме. Он смог выявить одну закономерность — баг возникал, когда тестеры использовали геймпад. Сам Бэггетт почти не применял его, потому что он не нужен был для отладки системы и написания кода.

Как обычный геймпад мог привести к очистке карты памяти на PS1 — история бага в Crash Bandicoot

Бэггетт связался с инженером из Sony, который отрицал возможность аппаратной ошибки, но пообещал протестировать систему. Проверки показали, что дело действительно было в железе. Бэггетт признался, что до конца так и не разобрался, почему возникал баг, но скорее всего всё было так. Контроллер, отвечающий за скорость записи и чтения данных для карты памяти, также устанавливал скорость передачи данных для геймпадов.

В результате к ошибке приводило сочетание двух факторов. Во-первых, это перекрёстные помехи между отдельными частями материнской платы, а во вторых — одновременная передача данных для порта геймпада и порта карты памяти с частотой 1 кГц. В таком случае биты информации пропадали, а данные на карте портились.

#опыт #ps1 #crashbandicoot

221221
89 комментариев

тестеры использовали джойстикГеймпад.

109
Ответить

Джойстик значит джойстик

24
Ответить

справедливо. Поменял

3
Ответить

официально по гайдлайнам Sony - контроллер

1
Ответить

Контроллер

1
Ответить

Это теперь так менеджер сказал говорить?

Ответить

история бага в Crash BandicootБэггетт признался, что до конца так и не разобрался, почему возникал баг

78
Ответить