처리중입니다. 잠시만 기다려주세요.
TTJ 코딩클래스
정규반 단과 자료실 테크 뉴스 코딩 퀴즈
테크 뉴스
Hacker News 2026.09.04 29

LLM이 1993년 아미가 어셈블리를 읽고 게임을 이식하다

Hacker News 원문 보기

1993년 바그다드, 20대 공학도였던 개발자는 아미가 500 위에서 플랫포머 게임 '바빌로니안 트윈스'를 만들었다. 램은 512KB, 하드디스크는 없었고 본체는 TV에 연결돼 있었다. 순수 68000 어셈블리로 스프라이트와 스캔라인을 손으로 짰다. 인터넷도 개발 자료도 없이 단 한 권의 아미가 하드웨어 레퍼런스 매뉴얼만으로 하드웨어를 직접 제어했고, 제재와 정전, 50도에 이르는 여름 더위 속에서 디스크 드라이브가 세 번이나 고장 났다. 이라크에서 만들어진 첫 상업용 게임이었지만 코모도어의 몰락과 제재로 오랫동안 선반 위에 방치됐다. 이 게임은 2010년 같은 팀이 약 3만 4천 줄의 C++로 아이폰용 엔진을 새로 짜 손으로 한 번 이식했고, 200만 다운로드를 넘겼다.

올여름 개발자는 세 번째 이식을 사람이 아닌 LLM에게 맡겼다. 그는 이식을 직접 하지 않았다. 요청하고, 매일 밤 결과물을 플레이하고, 어색한 지점을 지적하고, 1993년을 겪은 사람만 내릴 수 있는 몇 가지 결정만 내렸다. 파일 포맷 해독과 어셈블리 읽기, 30년 된 코드를 옮기는 방식에 관한 판단은 모두 AI의 몫이었다. 흥미로운 점은 이 실험이 의도적으로 불리하게 설계됐다는 것이다. 아미가 어셈블리는 LLM 학습 데이터에 거의 없을 것이라는 가정 아래, 모델이 '기억'이 아니라 '추론'으로 문제를 푸는지를 시험하는 자리였다.

세 단계 실험

작업은 조건부로 이어지는 세 단계로 계획됐다. 첫째는 안전한 요청으로, 2010년의 C++ 엔진을 Godot 4로 옮기는 대조군이었다. 빈 프로젝트에서 조작 가능한 캐릭터가 나오기까지 21분이 걸렸다. 둘째는 불공정한 요청으로, 주석도 거의 없고 C++과 공통점이 전혀 없는 원본 68000 어셈블리 7만 2,758줄을 아미가 원래 속도인 50Hz로 Godot에 재구축하는 것이었다. 셋째는 이 원본을 현대판 안에 집어넣어, 게임을 사면 1993년 원작도 별도로 실행할 수 있게 하는 욕심 어린 요청이었다. 세 단계 모두 성공했고, 1년 전 이전 모델이 여러 차례 힌트를 받고도 겨우 풀어낸 레벨 포맷을 이번에는 한 번에 처리했다.

실험은 Claude Code 환경에서 진행됐기에 모델은 터미널과 파일시스템에 접근할 수 있었다. 파일을 편집하고, 어셈블러를 돌리고, 빌드하고, 게임을 실행해 결과를 읽었다. 초기에 모델은 사람 없이도 플레이할 수 있도록 커맨드라인 플래그를 추가했고, 모든 스크립트를 컴파일하고 모든 레벨을 빌드해 실패를 보고하는 헤드리스 검사를 스스로 돌렸다. 다만 자동화되지 않은 영역도 분명했다. 현대판에는 이미지 비교가 없어 스크린샷은 사람이 눈으로 확인했고, '게임의 손맛'이 맞는지 판단하는 검증은 어디에도 없었다.

틱 레이트라는 함정

이번 이식이 드러낸 가장 실무적인 교훈은 프레임 속도에 얽힌 물리 상수 문제다. 원작은 매 프레임 마찰을 곱셈으로 적용한다. 0.85를 초당 60번 곱하는 것과 초당 50번 곱하는 것은 전혀 다른 마찰값을 낳는다. 틱 레이트가 다른 환경으로 옮기면 게임의 모든 가속 곡선이 바뀌는데, 크래시가 나지 않고 그저 영원히 이상하게 느껴질 뿐이라 diff를 아무리 읽어도 찾을 수 없다. 그래서 1993년 재구축본은 50Hz, 현대판은 60Hz로 각자의 손으로 튜닝된 숫자가 자기 틱에서만 정확하도록 두 개의 시계를 그대로 유지했다. 사람이라면 하나로 정리하고 싶었을 부분이다.

마찬가지로 Godot이 기본 제공하는 CharacterBody2D와 move_and_slide()는 플레이어에 쓰이지 않았다. 원작은 손으로 짠 이동 코드를 갖고 있고, 이를 남의 물리 엔진 위에 올리면 추적하기 힘든 방식으로 미묘하게 어긋난다. 플레이어는 평범한 Node2D로 남았고, 150줄짜리 충돌 루틴은 15년 전 감으로 고른 보정 숫자와 미래의 자신에게 남긴 주석까지 한 줄 한 줄 그대로 옮겨졌다. 테스트도 문서도 없으니 그 주석들이 곧 명세였다.

바이트로 증명하다

포팅에 앞서 모델은 1993년 소스가 다시 어셈블되도록 만들었고, 출력이 실제 출시된 바이너리와 바이트 단위로 동일해질 때까지 밀어붙였다. 원본은 ASM-One으로 작성돼 vasm과 인코딩 방식이 달랐고, 2008년 저장 매체 이전 과정에서 긴 파일명이 잘려 include 경로가 모두 깨져 있었다. 모델은 소스를 고치는 대신 다섯 가지 차이를 메우는 전처리 패스를 짜고 파일명 매핑을 하나씩 복구했다. 특히 링커도 재배치도 없이 주소를 직접 배치하는 org 처리에서 초기 우회책이 한 곳을 틀려, 이후 모든 것이 944바이트 어긋난 채 엉뚱한 화면을 그리기도 했다. 끝까지 맞지 않던 약 108바이트는 출시 파일이 깨끗한 어셈블러 출력이 아니라 게임을 실행한 뒤 메모리를 저장한 스냅샷이었음을 밝혀냈다.

개발자가 몇 주 뒤에야 깨달은 이 대목이 프로젝트에서 가장 중요한 성과였다. 아무도 요구하지 않았지만, 그 순간부터 게임에 관한 모든 주장은 바이트 비교로 결정할 수 있게 됐다. 레벨 포맷 역시 헤더도 크기 정보도 없는 숫자 목록이었지만, 모델은 1,652줄짜리 무주석 로더에서 그리기 루틴을 찾아 그리드 순회 방식을 역산해 다섯 레벨의 맵을 첫 시도에 정확히 뽑아냈다. 이어 2020년에 캡처해 둔 전체 레벨 이미지와 픽셀 단위로 비교해, 하늘 그라데이션과 물 색상 순환이라는 두 카퍼 효과를 찾아낸 뒤에는 9,600픽셀 폭에 이르는 화면에서 어긋난 픽셀이 하나도 없었다. 검증 가능한 산출물을 스스로 만들어 낸다는 점이 이 실험이 남긴 진짜 의미다.

이 뉴스가 유용했나요?

이 기술을 직접 배워보세요

AI 도구, 직접 활용해보세요

AI 시대, 코딩으로 수익을 만드는 방법을 배울 수 있습니다.

AI 활용 강의 보기

"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"

실제 수강생 후기
  • 비전공자도 6개월이면 첫 수익
  • 20년 경력 개발자 직강
  • 자동화 프로그램 + 소스코드 제공

매일 AI·개발 뉴스를 받아보세요

주요 테크 뉴스를 매일 아침 이메일로 전해드립니다.

스팸 없이, 언제든 구독 취소 가능합니다.