- 2024년 공개된 1996년 9월 Sega Channel 게임 이미지 CD 덕분에, 약 60MB 방송용 이미지에서 게임과 메뉴 데이터를 실제로 꺼내 볼 수 있게 됨
- Sega Channel은 케이블망으로 Genesis 게임을 반복 송출하던 월정액 서비스였고, 사용자는 어댑터가 연속 데이터 루프에서 원하는 게임을 찾아 내려받는 방식으로 플레이함
- 이미지 생성 체인은 MENUMAKR, PKSPREAD, NSF로 이어졌으며, 최종 인코딩을 맡은 NSF.EXE에 디버그 심볼이 남아 있어 분석의 돌파구가 됨
- 복원은 NSF와 동일한 출력을 내는 C 프로그램을 만든 뒤, 역순 디코더로 파일을 분리하고 .SA 압축을 풀어 표준 Genesis ROM을 얻는 흐름으로 진행됨
- 추출된 콘텐츠에는 Sega Channel 독점 게임 Chessmaster와 Klondike, 새 빌드, 워터마크가 붙은 ROM, 메뉴와 게임 설명 ROM이 포함됐고 모두 에뮬레이터에서 실행 가능한 상태가 됨
Sega Channel 서비스와 이미지 파일의 배경
- Sega Channel은 1994년 6월부터 1998년 6월까지 운영된 게임 온디맨드 서비스였음
- 전국 출시는 1994년 12월에 진행됨
- 케이블 사업자에 따라 보통 월 10~15달러를 내고 매달 약 50개 Sega Genesis 게임 라이브러리에 접근할 수 있었음
- 서비스 최고 가입자 수는 약 25만 명 수준이었음
- 가입자는 Genesis에 연결하는 어댑터 카트리지를 받았고, 이 어댑터는 케이블 TV 선에 연결됨
- 부팅 시 Sega Channel 신호를 찾고 게임 메뉴를 다운로드함
- 메뉴 다운로드에는 보통 약 20초가 걸림
- 게임을 선택하면 어댑터 RAM으로 약 1분 동안 다운로드됨
- 내려받은 게임은 일반 소매 카트리지처럼 동작함
- 전원을 끄거나 어댑터의 메뉴 버튼을 누르면 다운로드된 게임은 지워짐
- 저장 데이터는 사용자가 다른 게임을 다운로드하지 않는 한 유지됨
- Sega Channel에는 소매 게임 외에 Test Drives 섹션도 있었음
- 출시 전 게임의 시간 제한 또는 콘텐츠 제한 버전을 플레이할 수 있었음
- Sega Channel에서만 제공된 게임도 존재함
방송용 이미지가 만들어지고 전달되는 방식
- Sega Channel 직원은 월별 게임 라인업과 게임 힌트, 매뉴얼, 뉴스, 디지털 팬아트 같은 콘텐츠를 선정함
- 이후 콘텐츠는 Foley Hi-Tech로 전달됨
- Foley Hi-Tech는 게임 메뉴 그래픽과 애니메이션을 만들고 월별 콘텐츠를 삽입함
- 결과물은 약 60MB 크기의 게임 이미지 파일이었음
- 게임 이미지는 CD로 구워져 콜로라도 덴버의 위성 업링크 시설로 보내짐
- CD는 업링크 게임 서버 컴퓨터에 설치됨
- 서버는 게임 데이터를 위성으로 계속 루프 송출함
- 미국 전역의 케이블 헤드엔드는 위성 신호를 받아 가입자에게 전달함
- 케이블 TV 사업자가 가입자로부터 데이터를 받을 수 없던 환경에서, 연속 루프 송출이 서비스의 상호작용 방식을 결정함
- 사용자가 게임을 선택하면 어댑터는 Sega Channel 데이터 스트림에서 해당 게임 데이터를 찾아냄
- 약 60MB 게임 이미지는 2개의 6Mbps 캐리어를 사용해 약 12Mbps로 전송됨
- 신호 문제가 없으면 사용자는 데이터 한 루프 안에 선택한 게임을 플레이할 수 있었음
- 메뉴는 더 빨리 내려받을 수 있도록 데이터 스트림에 중복 사본이 들어감
1996년 9월 게임 이미지 CD 발견
- 2024년 11월 Sonic Retro 포럼 사용자 RisingFromRuins가 오래전 구입한 PC 장비 더미를 확인하던 중 1996년 9월 Sega Channel 게임 이미지 CD를 발견함
- 그는 CD 사진을 올리고 디스크의 게임 이미지 파일 사본을 업로드함
- 분석 목표는 이미지 파일에서 데이터를 추출해 독점 게임이나 프로토타입 게임이 있는지 확인하는 것이었음
- 처음에는 헥스 에디터로 이미지 파일을 확인함
- Genesis 게임에는 표준 ASCII 헤더가 있고, 게임 힌트와 다운로드 가능한 매뉴얼도 읽을 수 있을 것으로 예상했음
- 실제 파일에서는 읽을 수 있는 문자열이 보이지 않음
- 이미지 파일이 스크램블되었거나 암호화되었을 가능성이 커짐
개발 도구 CD에서 찾은 이미지 생성 체인
- 2017년 사용자 tdijital이 Foley Hi-Tech의 Sega Channel 개발 자료 백업 CD를 공개한 것이 중요한 단서가 됨
- 이 CD에서는 Primal Rage 콘테스트 버전, 일본판 Sega Channel 퀴즈 게임, 1994년 12월~1996년 1월 메뉴 데모 ROM 등이 확인된 적이 있었음
- 개발 도구 자체는 깊게 분석되지 않은 상태였음
- Genesis 쪽 다운로드 코드를 역공학하는 대신, 게임 이미지를 만든 도구를 역공학하는 접근을 택함
- 이미지 생성 흐름은 세 단계였음
- MENUMAKR: 게임, 설명, 뉴스 텍스트, 아트, 음악 등을 추가해 메뉴 바이너리와
MENUSPIN.BAT스크립트 파일을 만듦 - PKSPREAD: Scientific Atlanta가 만든 프로그램으로,
MENUSPIN.BAT내용을 검증하고PMAP.DAT를 출력함 - NSF:
PMAP.DAT를 사용해 입력 파일을 인코딩하고 최종 게임 이미지 파일을 생성함
- MENUMAKR: 게임, 설명, 뉴스 텍스트, 아트, 음악 등을 추가해 메뉴 바이너리와
- Scientific Atlanta는 Sega Channel 방송 장비와 카트리지 어댑터 제작에서 Sega와 협력한 케이블 장비 회사였음
- 분석의 핵심 대상은 최종 이미지 파일을 만드는 NSF.EXE였음
NSF.EXE 리버스 엔지니어링
- NSF.EXE는 디버그 모드로 컴파일되어 있었고 최적화가 꺼져 있었으며 심볼도 실행 파일에 포함되어 있었음
- Borland C++ 4.1로 컴파일된 프로그램이었음
- IDA Pro가 디버그 심볼을 자동으로 인식하지 못해 Turbo Debugger에서 심볼을 확인하고 수동으로 옮김
- 바로 디코더를 작성하지 않고, 먼저 NSF.EXE와 동등한 프로그램을 작성함
- DOS NSF.EXE가 만든 이미지와 바이트 단위로 동일한 출력을 만들 수 있으면 알고리듬을 올바르게 파악한 것으로 볼 수 있었음
- 테스트 게임 이미지 파일을 만들고 출력이 일치하도록 구현함
- 하루 작업과 며칠 저녁 디버깅 끝에 NSF.EXE와 같은 출력을 내는 C 프로그램을 작성함
- IDA와 Visual Studio를 함께 열고 어셈블리에 최대한 가깝게 맞추는 방식으로 구현함
- 원본과 같은 컴파일 바이너리를 만드는 데는 목표를 두지 않았음
- 구현에는 C99 선언과
stdint.h타입을 사용했기 때문에 Borland C++ 4에서 그대로 컴파일되지 않을 가능성이 있음
NSF의 전송용 인코딩 방식
- NSF의
GetData함수는PMAP.DAT에서 패킷별 입력 파일, 파일 내 위치, Sega Channel 메타데이터를 가져옴- 메타데이터에는 파일 ID와 시간 제한 데모의 플레이 가능 시간 등이 포함됨
- 이후 데이터 파일에서 246바이트 청크를 읽음
LoadFrame함수는 데이터 패킷 앞에 헤더를 붙이고 모든 데이터 바이트를 뒤집음- 바이트 반전은 데이터 전송 관련 처리이거나 패킷 내용을 가리기 위한 처리일 수 있음
- 게임 데이터 중간에는 BCH 오류 정정 코드와 패리티 비트가 삽입됨
- 그 결과 246바이트 데이터가 288바이트로 확장됨
- 헤더에는 여러 필드가 들어감
GameTimeSync와GameTimeBit는 게임 시간 제한 값을 비트 단위로 전달함ServiceID는 보통 1이며, Express Games와 관련이 있을 가능성이 있음FileID는 게임 이미지 안의 각 파일을 고유하게 식별하며 메뉴는 항상 파일 0임Address는 어댑터가 파일을 RAM 어디에 다운로드할지를 나타냄HeaderCRC와Header Copy도 포함됨
InterLeave함수는 패킷을 450비트 청크로 나누고 각 청크의 비트를 섞음- 버스트 오류를 더 고르게 분산해 오류 정정이 잘 동작하게 하려는 처리로 보임
- 이 과정은 10개 패킷 단위로 반복됨
- 10개 패킷은 2880바이트 프레임으로 묶임
- 프레임은 패킷 0의 첫 2바이트, 패킷 1의 첫 2바이트처럼 데이터를 엮은 뒤 디스크에 기록됨
- 같은 처리가 전체 이미지 파일이 생성될 때까지 이어짐
디코딩과 압축 해제
- NSF 동작을 파악한 뒤, 과정을 역순으로 되돌리는 디코더 프로그램을 작성함
- 디코더는 이미지에서 개별 데이터 파일들을 추출함
- 처음 나온 디코더 출력은 유효한 Genesis ROM 데이터가 아니었음
- 게임 데이터가 전송 전에 압축되어 있었기 때문임
- ROM 압축 도구는 Foley Hi-Tech CD 안의
GAMEEDIT.EXE였음- 이 도구 자체를 다시 역공학할 필요는 없었음
- GitHub 사용자 Octocontrabass가 이미 .SA 압축 형식을 역공학해 둔 상태였음
- Octocontrabass의
unsa도구로.SA파일을 표준 ROM 파일로 압축 해제함
1996년 9월 이미지에서 나온 게임과 콘텐츠
- 가장 눈에 띄는 결과는 1996년 9월 방송된 Sega Channel 독점 게임 2개였음
- Chessmaster: 1990년대 여러 플랫폼에 있었지만 Genesis에는 없던 체스 게임
- Klondike: Sega가 Sega Channel용으로 의뢰했고 Pitfall로 알려진 David Crane이 프로그래밍한 솔리테어 게임
- 이미지 안의 게임은 여러 범주로 분류됨
- 독점 콘텐츠: Chessmaster, Klondike, Olympic Summer Games - Test Drive, Sega Channel Game Guide
- 새 빌드: Bugs Bunny in Double Trouble, OutRunners, Super Volleyball, World Series Baseball '96
- 기존 덤프와 패딩만 다른 항목: Flashback, Phantasy Star II, The Punisher
- 워터마크가 추가된 기존 덤프: Alex Kidd in the Enchanted Castle, Ecco - The Tides of Time, Sonic & Knuckles 등
- 기존 덤프와 일치하는 다수의 게임: Castlevania - Bloodlines, Streets of Rage 2, ToeJam & Earl, X-Men, Ys III 등
- Sonic Retro의 Black Squirrel은 1996년 9월 메뉴를 에뮬레이터에서 실행하는 방법을 찾음
- Sega Channel 데모 카트리지 ROM의
0-0x1003FF바이트를 복사하고, 게임 이미지의 메뉴 데이터를 뒤에 붙이는 방식임 - 다운로드 기능은 동작하지 않지만 메뉴는 둘러볼 수 있음
- Sega Channel 데모 카트리지 ROM의
- 마지막 콘텐츠는 게임 설명 ROM이었음
- 일반 Genesis ROM처럼 보였지만 에뮬레이터에서 실행하면 검은 화면만 나왔음
- 원인은 일반 카트리지처럼 주소 0 기준이 아니라 0x100000 기준으로 링크되어 있었기 때문임
- Sega Channel 어댑터 메모리에서 직접 실행되도록 만들어진 것으로 보임
- 헤더 뒤에 0을 추가해 코드가 헤더의 벡터와 맞게 정렬되도록 하자 에뮬레이터에서 실행됨
- 실행 후에는 각 게임의 내부 이름이 보이는 개발자용 메뉴가 나타남
- 이 과정을 거쳐 게임 이미지 파일의 모든 콘텐츠를 에뮬레이터에서 실행할 수 있게 됨