TECH 으로 돌아가기
TECH HACKER NEWS 오늘 6분 읽기 23 READS

에뮬레이션이 아니라 재작성: 리버 레이드 브라우저 포팅이 보여주는 검증법

에뮬레이션이 아니라 재작성: 리버 레이드 브라우저 포팅이 보여주는 검증법
SOURCE IMAGE · HACKER NEWS

흉내가 아니라 똑같이 계산하기

아타리 2600의 고전 슈팅 게임 리버 레이드(Carol Shaw 제작)가 브라우저에서 돌아가는 포팅으로 다시 공개됐다. 겉보기에는 흔한 레트로 복각처럼 보이지만, 이 프로젝트가 기술적으로 흥미로운 이유는 구현 방식에 있다. 제작자는 에뮬레이터를 사용하지 않았다. 원본 카트리지 ROM을 6502 명령어 하나씩 읽어가며 자바스크립트로 다시 썼고, 원래 코드가 쓰던 128바이트 RAM을 동일한 주소 배치 그대로 재현했다. 게임의 '겉모습'을 모방한 것이 아니라, 원본이 메모리 위에서 수행하던 연산을 그대로 옮긴 것이다.

이 구분은 생각보다 크다. 일반적인 에뮬레이터는 CPU와 주변 장치를 통째로 흉내 내고 그 위에서 원본 바이너리를 실행시킨다. 반면 이 포팅은 ROM의 각 루틴을 사람이 직접 읽어 같은 동작을 하는 자바스크립트 코드로 치환했다. 결과물은 원본 바이너리를 해석하는 가상 머신이 아니라, 원본과 같은 상태 변화를 일으키도록 손으로 번역된 별도의 프로그램이다.

바이트 단위 비교로 증명하기

이런 수작업 번역에서 가장 어려운 문제는 '정말 원본과 똑같은가'를 어떻게 보장하느냐다. 제작자의 답은 명확하다. 작은 6502 코어를 함께 띄워 진짜 ROM을 포팅본 옆에서 나란히 실행시키고, 매 프레임마다 양쪽의 메모리를 바이트 단위로 비교한다. 한 바이트라도 어긋나면 그 지점에서 번역이 원본과 달라졌다는 뜻이다. 즉 레퍼런스 구현(원본 ROM)을 정답지로 삼아 재작성 코드를 지속적으로 대조하는 구조다.

이는 소프트웨어 공학에서 말하는 차등 테스트(differential testing)이자 골든 마스터 검증의 전형적인 형태다. 기대 출력을 사람이 일일이 명세하는 대신, 신뢰할 수 있는 기준 구현을 돌려 그 결과와 비교한다. 특히 레거시 코드를 다른 언어나 플랫폼으로 포팅할 때, '동작이 같다'는 주장을 기능 단위 테스트만으로 증명하기는 어렵다. 상태 전체를 프레임마다 맞춰보는 방식은 미묘한 누락이나 순서 차이까지 드러낸다는 점에서 참고할 만하다.

결정론이 드러나는 지점

게임 규칙 하나가 이 복원의 성격을 잘 보여준다. 제트기가 강둑이나 다리, 물 위 장애물에 닿아 추락하면 강은 해당 구간의 처음으로 되감기고 똑같은 전개가 그대로 다시 재생된다. 카트리지가 그 지점의 난수 값을 저장해 두었기 때문이다. 하드웨어 난수원이 없던 시절의 '유사 난수'는 사실상 결정론적 계산이었고, 덕분에 같은 시드에서는 항상 같은 강이 만들어진다. 이런 결정론은 포팅 검증에도 유리하다. 입력이 같으면 출력도 완전히 같아야 하므로, 프레임 단위 비교가 애초에 성립한다.

게임 내부 구조도 이 규칙성 위에 서 있다. 32개 블록이 한 구간을 이루고 모든 구간은 도로와 다리로 끝난다. 홀수 구간은 직선이고 짝수 구간은 섬을 끼고 갈라지며 굽이친다. 강을 거슬러 오를수록 적은 늘고 연료 보급소는 줄어든다. 연료 게이지는 매 프레임 줄어들어 E에 닿으면 추락하고, 보급소 위를 지나면 채워지지만 그 보급소를 쏘아버리면 80점은 얻되 연료는 사라진다. 배가 지나기엔 강폭이 좁은 곳에는 헬리콥터가 대신 배치되는데, 회전날개는 두 개의 모양을 한 프레임 걸러 번갈아 그려 표현한다. 이런 세부까지 원본과 맞춘다는 점이 수작업 번역의 집요함을 보여준다.

실무자가 가져갈 것과 한계

이 프로젝트에서 실무적으로 눈여겨볼 지점은 두 가지다. 첫째, 플랫폼 이전이나 언어 교체 작업에서 '기준 구현과의 상태 비교'가 회귀를 잡는 강력한 수단이 된다는 점이다. 테스트 케이스를 상상해서 짜는 대신, 신뢰할 수 있는 원본을 옆에서 돌려 어긋나는 순간을 자동으로 포착하는 발상은 모던 시스템 마이그레이션에도 그대로 적용된다. 둘째, 원본의 메모리 레이아웃을 그대로 유지한다는 선택은 번역의 정합성을 끝까지 추적 가능하게 만든다. 주소가 같으니 비교 대상도 일대일로 맞출 수 있다.

다만 이 복원이 콘솔 전체를 재현하는 것은 아니라는 점은 분명히 해둘 필요가 있다. 검증의 대상은 게임 ROM 루틴과 그 메모리 상태이지 하드웨어 전부가 아니며, 브라우저 환경 탓에 소리는 카트리지와 달리 첫 클릭이나 키 입력 후에야 시작된다. 이는 원본의 동작이 아니라 브라우저의 제약이라고 제작자도 명시하고 있다. 조작 역시 버튼 하나와 여덟 방향뿐이던 아타리 조이스틱을 반영해 모든 버튼이 발사로 통일된다. 완벽한 하드웨어 재현이 목표가 아니라, 한 게임의 로직을 명령어 단위로 정확히 옮기고 그것을 증명해 보이는 데 초점을 맞춘 작업으로 읽는 편이 정확하다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://plicerin.github.io/riverraid-rom-port/
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기 →
처리 중...